生产者会生产出很多消息 , 但是不同的消费者可能会有不同的需求,只需要接收指定的消息,其他的消息需要被过滤掉。 这时候就可以对消息进行过滤了。 在消费者端设置好需要接收的消息类型。
如果不使用默认的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的消息。