生成者重连和生产者确认机制2个机制不一样
生产者重连大部分场景是和mq进行交互,出现了网络波动。mq挂了的场景
生成者确认机制是生成者发送消息,发送失败了怎么办?
rabbitmq有2种机制分别是publisher confirm和publisher return 2种确认机制,机制开启后生产者往rabbimq发送消息,然后发送失败,这时候mq会告诉生产者是否成功
用java代码如何实现呢?
其实他有2中方式:1种是同步 1种是异步 同步是生产者把消息发送到mq,然后mq返回ack告诉生成者收到消息了,异步是生产者把消息发送到mq,然后接口处理其他事情,不用等待返回的ack
在配置文件中添加publisher-confirm-type 添加这个配置 顾名思义就是生产者确认类型
3中类型 none 关闭confirm机制 simple 同步 correlated 异步
第二种publise-returns:true 是开启了returns 是否开启返回失败消息的机制
return这种情况大部分都是在路由失败返回的
首先在配置中添加 publisher-confirm-type :corelated publisher-returns :true 是否开始失败回调
创建一个MqConfirmConfig用于回调告诉生产者收到消息了
消费者发送消息
我创建了CorrelationData然后给一个uuid他主要是在发送消息的时候,给消息一个唯一的id。
假如我们有3个mq的key配置错误,然后再回调的时候他会给这个uuid带上,能方便区别是那个uuid对应那个消息
结果
测试一下如果roukey不存在的情况下发送消息会出现什么情况
我把roukey改为red2
结果
可以看到2个uuid回来了,并且刚刚的retrun配置类也生效了其中有code:312 text:not_route 没有路由
如果交换机不存在,然后进行发送会出来nack情况
我自己分析了一下为什么交换机输错了,会触发nack不触发那个return
可能是因为你发送者先把消息给交换机,然后交换机在通过key路由到队列中
应该是交换机不存在,会直接返回
而路由key错的话,他是能找到交换机,只是找不到这个交换机上绑定的key所以不会出现nack。