SpringCloud Stream 整合RabbitMQ

本篇簡單介紹SpringCloud Stream 整合RabbitMQ基本步驟:

  • 引入SpringCloud
  • 引入SpringCloud Stream相關依賴
  • 定義綁定接口: 消息生產者(Output…Binding) 、消息消費者(Input…Binding)
  • @EnableBinding 在對應類上進行定義
  • @StreamListener 在對應方法上創建監聽用來消費消息
  • 調用output的send()方法生產消息

一、項目介紹

演示SpringCloud Stream 整合RabbitMQ,項目可以在一個工程裏完成,本次建立了一個工程mq-service,其中包含三個Module:

  • mq-service-base :基礎模塊(包含了共用依賴、共用變量)
  • mq-service-producer :生產者
  • mq-service-consumer :消費者

注: 完全可以在一個工程裏實現,這裏爲了區分,併爲了後續單獨啓動或停止生產者或消費者做實驗,也爲了適應實際應用項目,所以創建了不同Module

(1)版本
  • SpringBoot : 2.0.6.RELEASE
  • SpringCloud : Finchley.SR2
  • RabbitMQ : 3.8.1

(2)項目整體結構

在這裏插入圖片描述

(3)基礎模塊

1)pom.xml

這裏作爲公共模塊引入SpringCloud、Spring Cloud Stream等,其中也再此引入fastjson、lombok等工具依賴
(完整代碼見文章最下面)
其中Spring Cloud Stream如下:

<!-- Spring Cloud Stream, 用於MQ消息發送-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-stream</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
2) model

定義共用的變量,如CollectionRequest.java

二、生產者

(1)結構

在這裏插入圖片描述

(2)pom.xml

導入base的依賴即可,因爲相關共用依賴在base中已經引入

<dependency>
	<groupId>com.zrk</groupId>
	<artifactId>mq-service-base</artifactId>
	<version>0.0.1-SNAPSHOT</version>
</dependency>

(3)定義綁定(接口)

OutputMessageBinding.java

public interface OutputMessageBinding {

    /** Topic 名稱*/
    String OUTPUT = "message-center-out";

    @Output(OUTPUT)
    MessageChannel output();

}

(4)添加配置

# rabbitmq連接信息
spring.rabbitmq.addresses=192.168.1.125
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=123456

spring.cloud.stream.bindings.message-center-out.destination=message-center
spring.cloud.stream.rabbit.bindings.message-center-out.consumer.exchangeType=fanout

(5) 調用方法

CollectionServiceImpl.java

@Service
@EnableBinding(OutputMessageBinding.class)
public class CollectionServiceImpl implements CollectionService{

    @Resource
    private OutputMessageBinding outputMessageBinding;

    /**
     * @param schoolName
     * @param content
     */
    @Override
    public void getCollection(String schoolName, String content) {

        CollectionRequest request = new CollectionRequest();
        request.setSchoolName(schoolName);
        request.setContent(content);

        outputMessageBinding.output().send(MessageBuilder.withPayload(request).build());
    }
}

注: 主要是兩點

  • @EnableBinding 定義
  • outputMessageBinding.output().send(MessageBuilder.withPayload(request).build()); 生產消息

三、消費者

(1)結構

在這裏插入圖片描述

(2)pom.xml

導入base的依賴即可,因爲相關共用依賴在base中已經引入

<dependency>
	<groupId>com.zrk</groupId>
	<artifactId>mq-service-base</artifactId>
	<version>0.0.1-SNAPSHOT</version>
</dependency>

(3)定義綁定(接口)

InputMessageBinding.java

public interface InputMessageBinding {

    String INPUT = "message-center-input";

    @Input(INPUT)
    SubscribableChannel input();
}

注: 消費者這裏與生產者不同,用的是SubscribableChannel ,而生產者用的是MessageChannel

(4)添加配置

# rabbitmq連接信息
spring.rabbitmq.addresses=192.168.1.125
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=123456

spring.cloud.stream.bindings.message-center-input.destination=message-center
spring.cloud.stream.bindings.message-center-input.group=${spring.application.name}

(5) 調用方法

CollectionReceiver.java

@Slf4j
@EnableBinding(InputMessageBinding.class)
public class CollectionReceiver {

    @StreamListener(InputMessageBinding.INPUT)
    public void handle(String value){
        log.info("[消息] 接收到發送消息MQ: {}", value);
        CollectionRequest request = JSON.parseObject(value, CollectionRequest.class);
        log.info("處理收集信息:" + request.toString());
    }
}

注: 主要是兩點

  • @EnableBinding 定義
  • @StreamListener 註冊監聽

至此,生產者與消費者都創建完成,分別啓動兩個項目,並調用生產者接口進行驗證:

四、驗證

在postman 訪問生產者接口:

localhost:30110/collection/getCollection?schoolName=‘zrk’&content=‘send message to rabbitmq’
在這裏插入圖片描述

觀察消費者日誌:

在這裏插入圖片描述

查看rabbitmq首頁

在這裏插入圖片描述
在這裏插入圖片描述
則證明已經整合成功,接下來將研究一下更多的配置與用法。

如果有需要,可以參考項目完整代碼:https://github.com/zrk333/mq-service

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章