本篇簡單介紹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