RabbitMQ使用场景练习:监听器Listener(九)

  • 监听器
     RabbitMQ中监听器有ReturnListener、ConfirmListener、ShutdownListener,本练习中使用ReturnListener,在发布消息时设置mandatory等于true,监听消息是否有相匹配的队列,没有时ReturnListener将执行handleReturn方法,消息将返给发送者 
     设置mandatory=true,当路由不到队列时返回给消息发送者,在return监听器中接收 
     设置immediate=true,当路由不到消费者时返回,3.0以后版本已废弃,会影响镜像队列性能,建议采用消息TTL和DLX 


  • 注意要点

发送消息时mandatory设置为true
Java代码   收藏代码
  1. //设置mandatory=true,当路由不到队列时返回给消息发送者,在return监听器中接收  
  2. channel.basicPublish("header_exchange""" ,true,false,properties.build(), SerializationUtils.serialize(object));  

创建Return监听器
Java代码   收藏代码
  1. //增加return监听器,当发布消息且无匹配的队列时消息被返回给接收者  
  2. channel.addReturnListener(new ReturnListener() {  
  3.     @Override  
  4.     public void handleReturn(int replyCode, String replyText, String exchange,  
  5.         String routingKey, BasicProperties properties, byte[] body)   
  6.              throws IOException {  
  7.         System.out.println(SerializationUtils.deserialize(body));  
  8.     }  
  9. });  

除了Return监听器,还有ConfirmListener、ShutdownListener监听器  

  • mandatory、Return监听器练习

Java代码   收藏代码
  1. package com.demo.mq.rabbitmq.example09;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.Serializable;  
  5. import java.util.HashMap;  
  6. import java.util.Map;  
  7. import org.apache.commons.lang3.SerializationUtils;  
  8. import com.demo.mq.rabbitmq.MqManager;  
  9. import com.rabbitmq.client.BuiltinExchangeType;  
  10. import com.rabbitmq.client.Channel;  
  11. import com.rabbitmq.client.Connection;  
  12. import com.rabbitmq.client.ReturnListener;  
  13. import com.rabbitmq.client.AMQP.BasicProperties;  
  14. import com.rabbitmq.client.AMQP.BasicProperties.Builder;  
  15.   
  16. /** 
  17.  * mandatory、监听器使用练习 
  18.  * @author sheungxin 
  19.  * 
  20.  */  
  21. public class SendListener {  
  22.       
  23.     /** 
  24.      * 1、设置mandatory=true,当路由不到队列时返回给消息发送者,在return监听器中接收 
  25.      * 2、immediate,当路由不到消费者时返回,3.0以后版本已废弃,会影响镜像队列性能,建议采用消息TTL和DLX 
  26.      * 3、监听器:ReturnListener:mandatory=true时,无匹配queue时接收返回消息 
  27.      *        ConfirmListener:Ack、Nack,confirm模式,服务端监听 
  28.      *        ShutdownListener:监听关闭 
  29.      * @param object 消息主体 
  30.      * @throws IOException 
  31.      */  
  32.     public static void sendAToB(Serializable object) throws Exception{  
  33.         Connection conn=MqManager.newConnection();  
  34.         Channel channel=conn.createChannel();  
  35.         //声明headers转发器  
  36.         channel.exchangeDeclare("header_exchange", BuiltinExchangeType.HEADERS);  
  37.         //定义headers存储的键值对  
  38.         Map headers=new HashMap();  
  39.         headers.put("key""123456");  
  40.         headers.put("token""654321");  
  41.         //把键值对放在properties  
  42.         Builder properties=new BasicProperties.Builder();  
  43.         properties.headers(headers);  
  44.         properties.deliveryMode(2);//持久化  
  45.         //指定消息过期时间为12秒,队列上也可以指定消息的过期时间,两者以较小时间为准  
  46. //      properties.expiration("12000");//延时30秒,不会及时删除(在consuemr消费时判定是否过期,因为每条消息的过期时间不一致,删除过期消息就需要扫描整个队列)  
  47.         //增加return监听器,当发布消息且无匹配的队列时消息被返回给接收者  
  48.         channel.addReturnListener(new ReturnListener() {  
  49.             @Override  
  50.             public void handleReturn(int replyCode, String replyText, String exchange,  
  51.                     String routingKey, BasicProperties properties, byte[] body)  
  52.                     throws IOException {  
  53.                 System.out.println(SerializationUtils.deserialize(body));  
  54.             }  
  55.         });  
  56.         //设置mandatory=true,当路由不到队列时返回给消息发送者,在return监听器中接收  
  57.         channel.basicPublish("header_exchange""" ,true,false,properties.build(), SerializationUtils.serialize(object));  
  58.         System.out.println("Send '"+object+"'");  
  59.     }  
  60.       
  61.     public static void main(String[] args) throws Exception {  
  62.         sendAToB("Hello World !");  
  63.     }  
  64.   
  65. }  

你可能感兴趣的:(RabbitMQ)