zoukankan      html  css  js  c++  java
  • rabbitMQ学习笔记(五) 消息路由

    生产者会生产出很多消息 , 但是不同的消费者可能会有不同的需求,只需要接收指定的消息,其他的消息需要被过滤掉。 这时候就可以对消息进行过滤了。 在消费者端设置好需要接收的消息类型。

    如果不使用默认的Exchange发送消息,而是使用我们自定定义的Exchange发送消息,那么下面这个方法的第二个参数就不是QueueName了,而是消息的类型。

    channel.basicPublish( exchangeName , messageType , null , msg.getBytes());

    示例:Sender05.java

     1 package com.zf.rabbitmq05;
     2 
     3 import java.io.IOException;
     4 
     5 import com.rabbitmq.client.Channel;
     6 import com.rabbitmq.client.Connection;
     7 import com.rabbitmq.client.ConnectionFactory;
     8 
     9 /**
    10  * 发送消息
    11  * @author zhoufeng
    12  *
    13  */
    14 public class Sender05 {
    15     
    16     public static void main(String[] args) throws IOException {
    17         
    18         ConnectionFactory connFac = new ConnectionFactory() ;
    19         
    20         //RabbitMQ-Server安装在本机,所以直接用127.0.0.1
    21         connFac.setHost("127.0.0.1");
    22         
    23         //创建一个连接
    24         Connection conn = connFac.newConnection() ;
    25         
    26         //创建一个渠道
    27         Channel channel = conn.createChannel() ;
    28         
    29         String exchangeName = "exchange02";
    30         
    31         String messageType = "type01";
    32         
    33         channel.exchangeDeclare(exchangeName, "direct") ;
    34         
    35         //定义Queue名
    36         String msg = "Hello World!";
    37         
    38         //发送消息
    39         channel.basicPublish( exchangeName , messageType , null , msg.getBytes());
    40         
    41         System.out.println("send message[" + msg + "] to "+ exchangeName +" success!");
    42         
    43         channel.close(); 
    44         conn.close(); 
    45         
    46     }
    47 
    48 }
     1 package com.zf.rabbitmq05;
     2 
     3 import java.io.IOException;
     4 
     5 import com.rabbitmq.client.Channel;
     6 import com.rabbitmq.client.Connection;
     7 import com.rabbitmq.client.ConnectionFactory;
     8 import com.rabbitmq.client.ConsumerCancelledException;
     9 import com.rabbitmq.client.QueueingConsumer;
    10 import com.rabbitmq.client.QueueingConsumer.Delivery;
    11 import com.rabbitmq.client.ShutdownSignalException;
    12 
    13 /**
    14  * 接收消息
    15  * @author zhoufeng
    16  *
    17  */
    18 public class Recv05_01 {
    19 
    20     public static void main(String[] args) throws IOException, ShutdownSignalException, ConsumerCancelledException, InterruptedException {
    21         
    22         ConnectionFactory connFac = new ConnectionFactory() ;
    23         
    24         connFac.setHost("127.0.0.1");
    25         
    26         Connection conn = connFac.newConnection() ;
    27         
    28         Channel channel = conn.createChannel() ;
    29         
    30         
    31         String exchangeName = "exchange02";
    32         
    33         channel.exchangeDeclare(exchangeName, "direct") ;
    34         
    35         String queueName = channel.queueDeclare().getQueue() ;
    36         
    37         //第三个参数就是type,这里表示只接收type01类型的消息。
    38         channel.queueBind(queueName, exchangeName, "type01") ;
    39         //也可以选择接收多种类型的消息。只需要再下面再绑定一次就可以了
    40         channel.queueBind(queueName, exchangeName, "type02") ;
    41         
    42         
    43         //配置好获取消息的方式
    44         QueueingConsumer consumer = new QueueingConsumer(channel) ;
    45         channel.basicConsume(queueName, true, consumer) ;
    46         
    47         //循环获取消息
    48         while(true){
    49             
    50             //获取消息,如果没有消息,这一步将会一直阻塞
    51             Delivery delivery = consumer.nextDelivery() ;
    52             
    53             String msg = new String(delivery.getBody()) ;  
    54             
    55             System.out.println("received message[" + msg + "] from " + exchangeName);
    56         }
    57         
    58     }
    59     
    60 }

    这时,启动Recv05_01.java 然后启动Sender05.java ,消费者端就会收到消息。

    然后将Sender05.java 中的messageType分别改为type02  type03 然后发送消息 , 可以看到消费者端能接收到type02的消息,但是不能接收到type03的消息。

  • 相关阅读:
    HDU 1850 Being a Good Boy in Spring Festival
    UESTC 1080 空心矩阵
    HDU 2491 Priest John's Busiest Day
    UVALive 6181
    ZOJ 2674 Strange Limit
    UVA 12532 Interval Product
    UESTC 1237 质因子分解
    UESTC 1014 Shot
    xe5 android listbox的 TMetropolisUIListBoxItem
    xe5 android tts(Text To Speech)
  • 原文地址:https://www.cnblogs.com/jianliang-Wu/p/5684879.html
Copyright © 2011-2022 走看看