rabbitMQ学习笔记(五) 消息路由

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


如果不使用默认的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的消息。

你可能感兴趣的:(rabbitMQ学习笔记(五) 消息路由)