RabbitMQ的confirm消息确认机制和return消息机
代码地址: https://github.com/hmilyos/rabbitmq-api-demo
1.confirm消息确认机制
消息的确认是指生产者投递消息后,如果Broker接收到消息,则会给生产者一个应答。生产者进行接收应答,用来确认这条消息是否正常的发送到Broker,这种方式也是消息可靠性投递的核心保障。其流程图如下所示

实现confirm确认消息
第一步:在channel上开启确认模式:channel.confirmSelect()
第二步:在channel上添加监听:addConfirmListener,监听成功和失败的返回结果,根据具体的结果对消息进行重新发送、或记录日志等后续处理!
代码实现:

消费端代码无需什么修改

启动消费端

再启动生产端,注意看日志打印,收到了confirm

自此,confirm机制的用法接受完毕。
2.return消息机制
return Listener用于处理一些不可路由的消息!
生产者通过指定一个exchange 和 routingkey 把消息送达到某个队列中去,然后消费者监听队列,进行消费处理。但是在某些情况下,如果我们在发送消息时,当前的exchange 不存在或者指定的routingkey路由不到,这个时候如果要监听这种不可达的消息,就要使用 return Listener。流程图如下所示

实现return消息机制
在基础API中有一个关键的配置项 Mandatory:如果为true,则监听器会接收到路由不可达的消息,然后进行后续处理,如果为false,则broker端自动删除该消息。
代码实现


消费端代码和以前的一样,无需修改什么

先启动消费端,然后上rabbitMQ的管控台查看对应的exchange和queue是否创建,绑定成功。

再启动生产端,注意看打印的日志

监听器会接收到路由不可达的消息,然后进行后续处理,前提是消费端的Mandatory为true,可以修改为false,再试试看能不能接收到,我这里就不演示了。