1. 程式人生 > 其它 >rabbitmq進階:回撥函式之確認(confirm)模式、回退(return)模式

rabbitmq進階:回撥函式之確認(confirm)模式、回退(return)模式

技術標籤:springCloud佇列rabbitmq

一、確認(confirm)模式

運用場景

當生產者傳送訊息至交換機後的 成功或失敗 所處理的業務

廢話不多說,直接上程式碼

開啟確認模式

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
    virtual-host: /
    listener:
      simple:
        acknowledge-mode: manual # 消費者手動確認訊息
    publisher-confirm-type: correlated # 確認模式 confirm
    @Test
    void contextLoads() {

        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
            /**
             * @param correlationData 相關配置資訊
             * @param ack 交換機是否收到訊息
             * @param cause 失敗的原因
             */
            @Override
            public void confirm(CorrelationData correlationData, boolean ack, String cause) {
                if (ack) {
                    // TODO 傳送成功後的業務邏輯
                    System.out.println("訊息傳送成功");
                } else {
                    System.out.println("訊息傳送失敗");
                    System.out.println("失敗原因" + cause);
                    // TODO 傳送失敗後的業務處理
                }
            }
        });
        rabbitTemplate.convertAndSend("test.topic", "topic.order", "hello mq");
    }

測試:


二、回退(return)模式

概念

當生產方傳送給交換機後,而交換機傳遞給佇列失敗時,才會進行相應的業務處理

yml中

spring:
  rabbitmq:
    publisher-returns: true # 回退模式

測試:

建立一個消費者,接受訊息的引數型別為Integer

/**
 * @author [email protected]
 * @date 2020/12/8 14:41
 */
@Component
public class Test {

    @RabbitHandler
    @RabbitListener(queues = "topic.order")
    public void testHandler(Integer integer, Message message, Channel channel) throws IOException {
        System.out.println(integer);
        channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
    }
}

生產者:傳送一個String型別的資料,此時消費者會報錯,引數型別不匹配

    @Test
    void contextLoads() {
        rabbitTemplate.setMandatory(true); // 設定強制標誌 僅適用於回退模式
        rabbitTemplate.setReturnsCallback(new RabbitTemplate.ReturnsCallback() {
            @Override
            public void returnedMessage(ReturnedMessage returned) {
                System.out.println(returned.getMessage());
            }
        });
        rabbitTemplate.convertAndSend("test.topic", "topic.order", "aa");
    }

結果:NumberFormatException型別轉換異常

推薦閱讀

rabbitmq 訊息確認機制ACK