1. 程式人生 > 其它 >rabbitmq高階特性 訊息的可靠投遞

rabbitmq高階特性 訊息的可靠投遞

rabbitmq高階特性 訊息的可靠投遞

概念


confirm模式簡單使用

confirm模式會在訊息傳遞後執行一個回撥函式 通過回撥函式的值我們可以判斷是否正確投遞訊息給交換機
在boot整合rabbitmq基礎之後 編輯配置開啟confirm模式

spring:
  rabbitmq:
    host: 192.168.198.129
    port: 5672
    username: admin
    password: admin
    virtual-host: /
    publisher-confirm-type: correlated

編寫回調函式

    @Autowired
    RabbitTemplate rabbitTemplate;
    @Test
    void contextLoads() {
        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
            /**
             *
             * @param correlationData
             * @param ack 確認交換機是否收到訊息
             * @param s  失敗原因
             */
            @Override
            public void confirm(CorrelationData correlationData, boolean ack, String s) {
                System.out.println("confirm方法被執行了");
                if(ack){
                    System.out.println("接受成功 "+s);
                }
                else {
                    System.out.println("接受失敗 "+s);
                }
            }
        });
        rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME,"boot.haha","hello boot and mq");
    }

執行程式可以得知訊息正確投遞了

修改交換機名字為一個不存在的名字

執行程式

可以看到回撥函式成功得知傳送失敗了
因此通過這種機制我們可以確保訊息是否成功投遞給交換機

return模式簡單使用

return模式:
交換機路由到佇列時,如果出現問題才會執行ReturnCallBack
開啟return模式也需要我們手動去配置

配置開啟return模式

spring:
  rabbitmq:
    host: 192.168.198.129
    port: 5672
    username: admin
    password: admin
    virtual-host: /
    publisher-confirm-type: correlated
    publisher-returns: true

預設為廢棄原則 即出現問題直接不鳥了 要手動改為執行回撥函式模式
rabbitTemplate.setMandatory(true);
編寫回調函式並測試使用

    @Test
    void test2(){
        //預設為廢棄原則 改為執行回撥函式原則
        rabbitTemplate.setMandatory(true);
        rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
            @Override
            public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
                System.out.println("執行了return方法");
            }
        });
        rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME,"boot22.haha","hello boot and mq");
    }

這裡routingKey是錯誤的 所以程式執行會執行回撥函式

總結

confirm模式 確保了 broker到交換機訊息傳遞成功
return模式 確保了交換機到佇列訊息傳遞成功
兩者結合即可做到訊息可靠投遞