1. 程式人生 > 實用技巧 >Rabbitmq傳送方訊息確認

Rabbitmq傳送方訊息確認

一、傳送方訊息確認點

都知道傳送方訊息確認,有兩個地方

  • 訊息傳送到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); }; } }