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

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

先說下這個引數的作用:

/**
* 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,則匹配不到的訊息直接被丟棄!