Rabbitmq傳送方訊息確認
阿新 • • 發佈:2020-08-21
一、傳送方訊息確認點
都知道傳送方訊息確認,有兩個地方
- 訊息傳送到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; @PostConstructpublic 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); }; } }