一、發送方消息確認點
都知道發送方消息確認,有兩個地方
- 消息發送到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); }; } }