• (转)RabbitMQ学习之主题topic(java)


    http://blog.csdn.net/zhu_tianwei/article/details/40887775

    参考:http://blog.csdn.NET/lmj623565791/article/details/37706355

    direct类型的消息通过绑定键转发到队列,但是存在一些局限性:它不能够基于多重条件进行路由选择,有可能希望不仅根据日志的级别而且想根据日志的来源进行订阅,这就需要主题类型的转发器来实现。

    发往主题类型的转发器的消息不能随意的设置选择键(routing_key),必须是由点隔开的一系列的标识符组成。标识符可以是任何东西,但是一般都与消息的某些特性相关。一些合法的选择键的例子:"stock.usd.nyse", "nyse.vmw","quick.orange.rabbit".你可以定义任何数量的标识符,上限为255个字节。
    绑定键和选择键的形式一样。主题类型的转发器背后的逻辑和直接类型的转发器很类似:一个附带特殊的选择键将会被转发到绑定键与之匹配的队列中。需要注意的是:关于绑定键有两种特殊的情况。
    *可以匹配一个标识符。
    #可以匹配0个或多个标识符。

    1.发送日志消息SendLogTopic,发送4个消息绑定不同的绑定键, "kernal.info", "cron.warning",  "auth.info", "kernel.critical" 

    [java] view plain copy
     
     print?
    1. package cn.slimsmart.rabbitmq.demo.topic;  
    2.   
    3. import java.util.UUID;  
    4.   
    5. import com.rabbitmq.client.AMQP;  
    6. import com.rabbitmq.client.Channel;  
    7. import com.rabbitmq.client.Connection;  
    8. import com.rabbitmq.client.ConnectionFactory;  
    9.   
    10. //发送消息端  
    11. public class SendLogTopic {  
    12.     private static final String EXCHANGE_NAME = "topic_logs";  
    13.     public static void main(String[] args) throws Exception {  
    14.         // 创建连接和频道    
    15.         ConnectionFactory factory = new ConnectionFactory();    
    16.         factory.setHost("192.168.101.174");  
    17.     factory.setUsername("admin");  
    18.         factory.setPassword("admin");  
    19.         factory.setPort(AMQP.PROTOCOL.PORT);  
    20.         Connection connection = factory.newConnection();    
    21.         Channel channel = connection.createChannel();    
    22.         // 声明转发器  
    23.         channel.exchangeDeclare(EXCHANGE_NAME, "topic");    
    24.         //定义绑定键     
    25.         String[] routing_keys = new String[] { "kernal.info", "cron.warning",    
    26.                 "auth.info", "kernel.critical" };    
    27.         for (String routing_key : routing_keys)    
    28.         {     
    29.             //发送4条不同绑定键的消息  
    30.             String msg = UUID.randomUUID().toString();    
    31.             channel.basicPublish(EXCHANGE_NAME, routing_key, null, msg    
    32.                     .getBytes());    
    33.             System.out.println(" [x] Sent routingKey = "+routing_key+" ,msg = " + msg + ".");    
    34.         }    
    35.     
    36.         channel.close();    
    37.         connection.close();    
    38.     }  
    39.   
    40. }  


    2.定义接收kernel.*消息的消费者

    [java] view plain copy
     
     print?
    1. package cn.slimsmart.rabbitmq.demo.topic;  
    2.   
    3. import com.rabbitmq.client.AMQP;  
    4. import com.rabbitmq.client.Channel;  
    5. import com.rabbitmq.client.Connection;  
    6. import com.rabbitmq.client.ConnectionFactory;  
    7. import com.rabbitmq.client.QueueingConsumer;  
    8.   
    9. //接收kernel.*消息  
    10. public class ReceiveLogsTopicForKernel {  
    11.     private static final String EXCHANGE_NAME = "topic_logs";    
    12.     public static void main(String[] args) throws Exception {  
    13.         // 创建连接和频道    
    14.         ConnectionFactory factory = new ConnectionFactory();    
    15.         factory.setHost("192.168.101.174");  
    16.     factory.setUsername("admin");  
    17.        factory.setPassword("admin");  
    18.     factory.setPort(AMQP.PROTOCOL.PORT);  
    19.         Connection connection = factory.newConnection();    
    20.         Channel channel = connection.createChannel();    
    21.         // 声明转发器    
    22.         channel.exchangeDeclare(EXCHANGE_NAME, "topic");    
    23.         // 随机生成一个队列    
    24.         String queueName = channel.queueDeclare().getQueue();    
    25.             
    26.         //接收所有与kernel相关的消息    
    27.         channel.queueBind(queueName, EXCHANGE_NAME, "kernel.*");    
    28.     
    29.         System.out.println(" [*] Waiting for messages about kernel. To exit press CTRL+C");    
    30.     
    31.         QueueingConsumer consumer = new QueueingConsumer(channel);    
    32.         channel.basicConsume(queueName, true, consumer);    
    33.     
    34.         while (true)    
    35.         {    
    36.             QueueingConsumer.Delivery delivery = consumer.nextDelivery();    
    37.             String message = new String(delivery.getBody());    
    38.             String routingKey = delivery.getEnvelope().getRoutingKey();    
    39.     
    40.             System.out.println(" [x] Received routingKey = " + routingKey    
    41.                     + ",msg = " + message + ".");    
    42.         }    
    43.     }  
    44. }  

    3.接收*.critical消息消费者

    [java] view plain copy
     
     print?
    1. package cn.slimsmart.rabbitmq.demo.topic;  
    2.   
    3. import com.rabbitmq.client.AMQP;  
    4. import com.rabbitmq.client.Channel;  
    5. import com.rabbitmq.client.Connection;  
    6. import com.rabbitmq.client.ConnectionFactory;  
    7. import com.rabbitmq.client.QueueingConsumer;  
    8.   
    9. //接收*.critical消息  
    10. public class ReceiveLogsTopicForCritical {  
    11.       
    12.      private static final String EXCHANGE_NAME = "topic_logs";    
    13.   
    14.     public static void main(String[] args) throws Exception {  
    15.         // 创建连接和频道    
    16.         ConnectionFactory factory = new ConnectionFactory();    
    17.         factory.setHost("192.168.101.174");  
    18.     factory.setUsername("admin");  
    19.         factory.setPassword("admin");  
    20.     factory.setPort(AMQP.PROTOCOL.PORT);  
    21.         Connection connection = factory.newConnection();    
    22.         Channel channel = connection.createChannel();    
    23.         // 声明转发器    
    24.         channel.exchangeDeclare(EXCHANGE_NAME, "topic");    
    25.         // 随机生成一个队列    
    26.         String queueName = channel.queueDeclare().getQueue();    
    27.         // 接收所有与kernel相关的消息    
    28.         channel.queueBind(queueName, EXCHANGE_NAME, "*.critical");    
    29.     
    30.         System.out    
    31.                 .println(" [*] Waiting for critical messages. To exit press CTRL+C");    
    32.     
    33.         QueueingConsumer consumer = new QueueingConsumer(channel);    
    34.         channel.basicConsume(queueName, true, consumer);    
    35.     
    36.         while (true)    
    37.         {    
    38.             QueueingConsumer.Delivery delivery = consumer.nextDelivery();    
    39.             String message = new String(delivery.getBody());    
    40.             String routingKey = delivery.getEnvelope().getRoutingKey();    
    41.     
    42.             System.out.println(" [x] Received routingKey = " + routingKey    
    43.                     + ",msg = " + message + ".");    
    44.         }    
    45.     }  
    46.   
    47. }  


    启动2个消费者,再启动发送4类消息生产者。观察接收到的消息,都收到对应的消息。可以看出使用topic类型的转发器,成功实现了多重条件选择的订阅。

  • 相关阅读:
    前段性能----详细渲染过程
    前段性能----repaint和reflow
    前段性能----缓存机制
    前段性能----带宽与延迟
    前端性能----从输入URL开始到返回数据的中间经历过程
    前端性能----TCP协议
    前端性能----CDN
    前端性能优化-学习链接,待持续更新
    前端性能----图像优化(图片)
    前端性能----静态资源,资源压缩
  • 原文地址:https://www.cnblogs.com/telwanggs/p/7124621.html
Copyright © 2020-2023  润新知