1.springboot整合spring cloud stream实现多mq对接
2.pom引入如下关键依赖,注意springcloud版本和springboot的版本关系,要版本相对应,一下已引入springcloud版本管理,复制使用即可
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR3</spring-cloud.version>
</properties>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-test-support</artifactId>
<scope>test</scope>
</dependency>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2.添加配置文件
spring:
cloud:
stream:
bindings:
input:
destination: testQueue
binder: testBinder
group: aaaa
output:
destination: testQueue
binder: testBinder
group: aaaa
intwo:
destination: testQueue2
binder: testBinder2
group: bbb
outtwo:
destination: testQueue2
binder: testBinder2
group: bbb
binders:
testBinder:
type: rabbit
environment:
spring:
rabbitmq:
host: 你自己的mqip
port: 5672
username: 用户名
password: 密码
testBinder2:
type: rabbit
environment:
spring:
rabbitmq:
host: 你自己的mqip
port: 5672
username: 用户名
password: 密码
3.编写bingder配置类
import org.springframework.cloud.stream.annotation.Input;
import org.springframework.cloud.stream.annotation.Output;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.SubscribableChannel;
import org.springframework.stereotype.Component;
@Component
public interface MyProcessor {
String intwo = "intwo";
String outtwo = "outtwo";
@Input(value = intwo)
SubscribableChannel intwo();
@Output(value = outtwo)
MessageChannel outtwo();
}
4.启动类把配置类引进来,可以配置多个,其中只有一个是默认配置类
该注解添加在应用启动类上
@EnableBinding(value = {Processor.class,MyProcessor.class})
5.编写消息发送,以下代码发送的数据将使用inttwo接收
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/tt")
public class TestController {
@Autowired
MyProcessor myProcessor;
@RequestMapping("/test/{msg}")
public void test(@PathVariable("msg")String msg){
Message<String> build = MessageBuilder.withPayload(msg).build();
myProcessor.outtwo().send(build);
}
}
6.编写消息监听
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.cloud.stream.messaging.Processor;
import org.springframework.cloud.stream.messaging.Source;
import org.springframework.stereotype.Component;
@Component
public class MultiTest {
@StreamListener(Processor.INPUT)
public void processMyMessage(String message) {
System.out.println("接收到消息:" + message);
}
@StreamListener(MyProcessor.intwo)
public void processMyMessage2(String message) {
System.out.println("接收到消息intwo:" + message);
}
}
7.启动服务,将会根据配yml配置文件创建交换机和对应mq
8.通过访问/tt/test/msg发送数据或直接通过mq管理页面发送数据
在控制台可接收到相关数据:
至此正常整合接收与发送完成
9.以上整合测试完毕,既可以将代码移植如现有的开发项目中
移植后遇到的问题是,项目启动后会自动连接本地,但配置文件中并没有做相关配置,项目yml配置文件并没有配置本地mq。报错如下:
即项目启动完成后开始尝试去连接本地的mq,因为我的应用时在本地启动的,服务中应该时有东西触发了mq的连接请求,所以,服务就去启动mq连接了,而这个项目中我们引入了stream,应按照yml配置文件进行连接,正常启动应该不会主动的去尝试连接配置之外mq的
正常启动应该到此为止,但移植后却主动尝试连接本地mq了,最终经过多方排查,原因是,现有项目中引入了springbootadmin,它默认开启了对mq的健康检查,所以触发了mq的本地连接,解决办法是在admin配置文件中将mq的健康检查进行关闭即可。