1. 程式人生 > >springboot整合rabbirmq中使用mandatory參數獲取匹配失敗的消息!

springboot整合rabbirmq中使用mandatory參數獲取匹配失敗的消息!

我們 edm rmq 整合 void 處的 rri emp bind

先說下這個參數的作用:

/**
* Mandatory為true時,消息通過交換器無法匹配到隊列會返回給生產者
* 為false時,匹配不到會直接被丟棄
*/
在一些特定場景下還是有用處的!
接下來說一下綁定隊列與交換器,需要在配置類或者xml中提前配置好
尤其是queue,如果同時寫了消費者,必須先配置好bean,即mq中隊列必須存在,不然會報錯
    //創建消息隊列
    @Bean
    public Queue testQueue(){
        //boolean表示消息是否持久化
        return new Queue("testQueue",true);
    }
    //創建交換器
    @Bean
    public DirectExchange exchange(){
        //boolean表示消息是否持久化
        return new DirectExchange("exchange");
    }
    //通過指定key綁定隊列與交換器
    @Bean
    Binding bindingExchangeMessages(@Qualifier("testQueue") Queue queue, DirectExchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with("routeKey");
    }

  綁定好之後就可以測試這個參數了,使用我們指定的交換器和key!

程序啟動之後會自動創建,這裏如果需要捕獲匹配失敗的消息需要添加一個監聽器

測試:當參數設置為true時,寫個錯誤的key:

技術分享圖片

    @Override
    public void sendTest() {
        /**
         * Mandatory為true時,消息通過交換器無法匹配到隊列會返回給生產者
         *          為false時,匹配不到會直接被丟棄
         */
        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("replyCode:"+replyCode);
                System.out.println("replyText:"+replyText);
                System.out.println("匹配隊列失敗,返回消息:" + message.toString());
            }
        });
        // 向指定交換器發送消息,需要key
        rabbitTemplate.convertAndSend("exchange","route","測試消息內容");
    }

 由於key不對,匹配隊列失敗,參數為true,所以消息會返回給生產者:

技術分享圖片

如果寫上正確key,則正常發送接受,如果

setMandatory

設置為false,則匹配不到的消息直接被丟棄!

springboot整合rabbirmq中使用mandatory參數獲取匹配失敗的消息!