說明
上次我們使用Amqp包進行MQ多數據源的接入,這次我們換一個包,使用SpringCloud裏的Stream來進行接入。這次的接入方式要看起來更清晰好看一些,不用寫配置Bean,通過bindings、binders、接口配置。
快速開始
引入包(我的Cloud版本爲Greenwich.SR2)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
<!-- Kafka使用下面的包 -->
<!-- <artifactId>spring-cloud-starter-stream-kafka</artifactId>-->
</dependency>
修改application.yml
spring:
cloud:
stream:
bindings:
# 以下是設置輸入通道及分組和輸出通道及類型
input1:
destination: queue1
content-type: application/json
# 如果不分組的話,隊列將會是匿名的
group: group1
binder: rabbitmq1
input2:
destination: queue2
content-type: application/json
group: group2
binder: rabbitmq2
output1:
destination: queue3
content-type: application/json
binder: rabbitmq3
binders:
rabbitmq1:
type: rabbit
environment:
spring:
rabbitmq:
host: xxx.xxx.xxx.xxx
port: 5672
username: yunlingfly
password: password
rabbitmq2:
type: rabbit
environment:
spring:
rabbitmq:
host: xxx.xxx.xxx.xxx
port: 5672
username: yunlingfly
password: password
rabbitmq3:
type: rabbit
environment:
spring:
rabbitmq:
host: xxx.xxx.xxx.xxx
port: 5672
username: yunlingfly
password: password
編寫接收MQ的接口
import org.springframework.cloud.stream.annotation.Input;
import org.springframework.messaging.SubscribableChannel;
public interface ISourceReceiver {
String INPUT = "input1";
String INPUT2 = "input2";
// 配置在application.yml裏了
@Input(INPUT)
SubscribableChannel input();
@Input(INPUT2)
SubscribableChannel input2();
}
編寫實現類
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.StreamListener;
@EnableBinding(value = {ISourceReceiver.class})
public class SourceReceiverImpl {
@StreamListener(ISourceReceiver.INPUT2)
public void receiver(String str) {
System.out.println("數據接收");
}
}
編寫發送MQ的接口
import org.springframework.cloud.stream.annotation.Output;
import org.springframework.messaging.MessageChannel;
public interface ISinkSender {
String OUTPUT="output1";
// 在這裏設置輸出通道,配置在application.yml裏
@Output(OUTPUT)
MessageChannel output();
}
編寫實現類
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.integration.support.MessageBuilder;
import org.springframework.stereotype.Service;
@Service
public class SinkSenderImpl {
@Autowired
ISourceReceiver sinkSender;
public void sendMessage2() {
sinkSender.input2().send(MessageBuilder.withPayload("發送數據").build());
}
}