mandatory和immediate

mandatory和immediate是channel.basicPublish方法中的兩個參數,他們都有當消息傳遞過程中不可達目的地時將消息返回給生產者的功能。RabbitMQ提供的備份交換器(Alternate Exchange)可以將未能被交換器路由的消息(沒有綁定隊列或者沒有匹配的綁定)存儲起來,而不是返回給客戶端。

mandatory參數

mandatory爲true時,交換器無法根據自身的類型和路由鍵找打一個符合條件的隊列,那麼RabbitMQ會調用Basic.Return命令將消息返回給生產者。mandatory爲false時,出現上述情形,消息直接被丟棄。
生產者通過調用channel.addReturnListener來添加ReturnListener監聽器來實現

channel.basicPublish(EXCHANGE_NAME,“”,true,MessageProperties.PERSISTENT_TEXT_PLAIN,“mandatory test”.getBytes());
channel.addReturnListener(new ReturnListener(){
	public void handleReturn(int replyCode,String replyText,String exchange,String routingKey,AMQP.BasicProperties basicProperties,byte[] body) throws IOException{
		String message = new String(body);
		System.out.println("Basic.Return返回的結果是:" + message);
	}
})

immediate參數

當immediate參數爲true時,如果交換器在將消息路由到隊列時發現隊列上並不存在任何消費者,那麼這條消息將不會存入隊列。當與路由鍵匹配的所有隊列都沒有消費者時,該消息會通過Basic.Return返回至生產者。
RabbitMQ3.0版開始去掉了對immediate參數的支持

備份交換器

Alternate Exchange,簡稱AE。生產者在發送消息的時候如果不設置mandatory參數,那麼消息在未被路由的情況下將會丟失;如果設置了mandatory參數,需要添加ReturnListener的編程邏輯,生產者的代碼將變得複雜。如果不想複雜化生產者的編程邏輯,又不想消息丟失,那麼可以使用備份交換器,這樣可以將未被路由的消息存儲在RabbitMQ中,再在需要的時候處理這些消息。
可以通過在聲明交換器(調用cannel.exchangeDeclare方法)的時候添加alternate-exchange參數來實現,也可以通過策略(Policy)的方式實現。如果兩者同時使用,則前者的優先級更高,會覆蓋掉Policy設置。

Map<String,Object> args = new HashMap<String,Object>();
args.put("altername-exchange","myAe");
channel.exchangeDeclare("normalExchange","direct",true,false,args);
channel.exchangeDeclare("myAe","fanout",true,false,false,null);
channel.queueDeclare("normalQueue",true,false,false,null);
channel.queueBind("normalQueue","normalExchange","normalKey");
channel.queueDeclare("unroutedQueue",true,false,false,null);
channel.queueBind("unroutedQueue","myAe","");

上面的代碼聲明瞭兩個交換器normalExchange和myAe,分別綁定了normalQueue和unroutedQueue這兩個隊列,同時將myAe設置爲normalExchange的備份交換器,注意myAe的交換器類型爲fanout。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章