springboot整合rabbirmq中使用mandatory引數獲取匹配失敗的訊息!
阿新 • • 發佈:2019-01-12
先說下這個引數的作用:
/**
* 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,則匹配不到的訊息直接被丟棄!