生產者會生產出很多消息 , 但是不同的消費者可能會有不同的需求,只需要接收指定的消息,其他的消息需要被過濾掉。 這時候就可以對消息進行過濾了。 在消費者端設置好需要接收的消息類型。
如果不使用默認的Exchange發送消息,而是使用我們自定定義的Exchange發送消息,那麼下面這個方法的第二個參數就不是QueueName了,而是消息的類型。
channel.basicPublish( exchangeName , messageType , null , msg.getBytes());
示例:Sender05.java
- package com.zf.rabbitmq05;
- import java.io.IOException;
- import com.rabbitmq.client.Channel;
- import com.rabbitmq.client.Connection;
- import com.rabbitmq.client.ConnectionFactory;
- /**
- * 發送消息
- * @author zhoufeng
- *
- */
- public class Sender05 {
- public static void main(String[] args) throws IOException {
- ConnectionFactory connFac = new ConnectionFactory() ;
- //RabbitMQ-Server安裝在本機,所以直接用127.0.0.1
- connFac.setHost("127.0.0.1");
- //創建一個連接
- Connection conn = connFac.newConnection() ;
- //創建一個渠道
- Channel channel = conn.createChannel() ;
- String exchangeName = "exchange02";
- String messageType = "type01";
- channel.exchangeDeclare(exchangeName, "direct") ;
- //定義Queue名
- String msg = "Hello World!";
- //發送消息
- channel.basicPublish( exchangeName , messageType , null , msg.getBytes());
- System.out.println("send message[" + msg + "] to "+ exchangeName +" success!");
- channel.close();
- conn.close();
- }
- }
- package com.zf.rabbitmq05;
- import java.io.IOException;
- import com.rabbitmq.client.Channel;
- import com.rabbitmq.client.Connection;
- import com.rabbitmq.client.ConnectionFactory;
- import com.rabbitmq.client.ConsumerCancelledException;
- import com.rabbitmq.client.QueueingConsumer;
- import com.rabbitmq.client.QueueingConsumer.Delivery;
- import com.rabbitmq.client.ShutdownSignalException;
- /**
- * 接收消息
- * @author zhoufeng
- *
- */
- public class Recv05_01 {
- public static void main(String[] args) throws IOException, ShutdownSignalException, ConsumerCancelledException, InterruptedException {
- ConnectionFactory connFac = new ConnectionFactory() ;
- connFac.setHost("127.0.0.1");
- Connection conn = connFac.newConnection() ;
- Channel channel = conn.createChannel() ;
- String exchangeName = "exchange02";
- channel.exchangeDeclare(exchangeName, "direct") ;
- String queueName = channel.queueDeclare().getQueue() ;
- //第三個參數就是type,這裏表示只接收type01類型的消息。
- channel.queueBind(queueName, exchangeName, "type01") ;
- //也可以選擇接收多種類型的消息。只需要再下面再綁定一次就可以了
- channel.queueBind(queueName, exchangeName, "type02") ;
- //配置好獲取消息的方式
- QueueingConsumer consumer = new QueueingConsumer(channel) ;
- channel.basicConsume(queueName, true, consumer) ;
- //循環獲取消息
- while(true){
- //獲取消息,如果沒有消息,這一步將會一直阻塞
- Delivery delivery = consumer.nextDelivery() ;
- String msg = new String(delivery.getBody()) ;
- System.out.println("received message[" + msg + "] from " + exchangeName);
- }
- }
- }
這時,啓動Recv05_01.java 然後啓動Sender05.java ,消費者端就會收到消息。
然後將Sender05.java 中的messageType分別改爲type02 type03 然後發送消息 , 可以看到消費者端能接收到type02的消息,但是不能接收到type03的消息。
轉載:http://blog.csdn.net/is_zhoufeng/article/details/10053057