Springboot整合RabbitMQ可靠性传输(分布式事务部分实现方案)
开发环境:rabbitmq-server-3.6.10、otp_win64_19.3(erlang版本);
1.RabbitMQ安装问题
在安装过程中,可能遇到以下问题:
- 如果同时安装了activemq和rabbitmq,默认配置下会启动失败,这是由于activemq也同时支持多种协议:tcp、amqp、stomp、mqtt,其中amqp监听的端口和rabbitmq一样(5672),导致冲突,在activemq.xml注释掉即可;
- 在rabbitmq的sbin目录下,命令行rabbitmqctl status报错nodedown,TCP connection succeed but Erlang distribution failed,解决办法:把C:\Windows下的.erlang.cookie文件同步到Administrator下
- 最后rabbitmq-plugins enable rabbitmq_management添加可视化插件,就可以访问管理界面localhost:15672,如果新增了自定义用户,注意查看Can access vitual hosts属性,否则项目启动会报socket closed
2.Springboot如何使用RabbitMQ
2.1 生产者配置
- 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>2.0.3.RELEASE</version>
</dependency>
- application.yml配置
spring:
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
publisher-confirms: true
publisher-returns: true
template:
mandatory: true
cache:
channel:
size: 100
其中publisher-confirms和publisher-returns是消息投递到MQ的回调,在代码中配置消息回调后的执行方案,mandatory设置为true表示routingkey找不到exchange绑定的queue就return给生产者,否则直接将消息丢弃。
- RabbitTemplate 消息可靠性传递
利用RabbitTemplate的回调机制,首先为消息设置一个uuid,传入CorrelationData,标志当前消息id,这样可以在消息投递后的回调中拿到这个id,然后把消息存入数据库或redis,性能考虑建议redis,回调时,如果投递成功,则从redis删除消息,如果投递失败,则可以设置定时任务重新投递或人工解决。
CorrelationData correlationData = new CorrelationData();
String uuid = UUID.randomUUID().toString();
correlationData.setId(uuid)