一、发送方消息确认点
都知道发送方消息确认,有两个地方
- 消息发送到broker的消息确认回调,发送到服务器,触发confirmCallBack ,ack=true 否 false
- 消息通过交换器绑定到队列的消息确认回调,发现没有与之绑定的队列时,触发returnCallBack
二、配置
2.1、yml
#rabbitmq rabbitmq: host: 192.168.99.12 port: 5672 username: guest password: guest # 发送确认 publisher-confirms: true # 路由失败回调 publisher-returns: true template: # 必须设置成true 消息路由失败通知监听者,false 将消息丢弃 mandatory: true
2.2、回调配置
回调配置是配置给RabbitTemplate的,一个是confirmCallBack一个是returnCallBack,根据面向搜索引擎编程规则,网上搜,你会发现零零散散,残缺不齐,还是得自己造轮子,不BB了,上代码
import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import javax.annotation.PostConstruct; /** * rabbitmq 模版配置发送确认 * @author DUCHONG * @since 2020-08-21 10:15:31 */ @Configuration @Slf4j public class RabbitTemplateConfig { @Autowired RabbitTemplate rabbitTemplate; @PostConstruct public void setConfirmAndReturnCallBack() { //设置ConfirmCallback rabbitTemplate.setConfirmCallback(confirmCallback()); //设置ReturnCallback rabbitTemplate.setReturnCallback(returnCallback()); } /** * ReturnCallback接口用于实现消息发送到RabbitMQ交换器,但无相应队列与交换器绑定时的回调 message 投递失败的详细信息 replyCode 回复的状态码 replyText 回复的文本内容 exchange 这个消息发送给哪个交换机 routingKey 这个消息用的哪个路由键 */ RabbitTemplate.ReturnCallback returnCallback(){ return (message, replyCode, replyText, exchange, routingKey) -> { //业务逻辑 log.info("returnCallback---->message---{},-->replyCode---{},-->replyText---{},-->exchange---{},-->routingKey---{}", message, replyCode, replyText, exchange, routingKey); }; } /** * ConfirmCallback接口用于实现消息发送到RabbitMQ交换器后接收ack回调 correlationData 消息的唯一id,给每一条信息添加一个dataId,放在CorrelationData,这样在RabbitConfirmCallback返回失败的时候可以知道是哪个消息失败 ack 消息是否成功收到 true 收到 false 未收到 cause 失败原因 */ RabbitTemplate.ConfirmCallback confirmCallback(){ return (correlationData, ack, cause) ->{ //业务逻辑 log.info("confirmCallback---->correlationData---{},-------->ack---{},-------->cause---{}",correlationData,ack,cause); }; } }