欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

RabbitMQ之路由模式

程序员文章站 2024-03-13 00:00:03
...

RabbitMQ之路由模式简介

 生产者发送消息的时候,绑定一个key
 消费者在接受消息的时候,也绑定一个key,两个key相同,那么就可以获取到 生产者发送的消息
 Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
 exchange接收到消息后,就根据消息的key和已经设置的binding,进行消息路由,将消息投递到一个或多个队列里。

 

代码参考

生产者

/**
 * 路由 什么是? 生产者发送消息的时候,绑定一个key 消费者在接受消息的时候,也绑定一个key,两个key相同,那么就可以获取到 生产者发送的消息
 * Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
 * exchange接收到消息后,就根据消息的key和已经设置的binding,进行消息路由,将消息投递到一个或多个队列里。
 * 
 * 特点: 一对多
 * 
 * @author zhang
 *
 */
public class SubScribeDriectSend {
	public static final String EXCHANGE_NAME = "test_exchange_direct";

	public static void main(String[] args) throws IOException, TimeoutException {
		// 连接
		Connection connect = ConnectHelp.getConnect();

		// 获取通道
		Channel channel = connect.createChannel();

		// 创建交换机
		channel.exchangeDeclare(EXCHANGE_NAME, "direct");// 路由

		// 消息
		String msg = "send a msg is error;";

		// 创建路由的key

		channel.basicPublish(EXCHANGE_NAME, "successful", null, msg.getBytes());

		System.out.println("交互机发送数据:" + msg);

		channel.close();
		connect.close();

	}

}

消费者1

/**
 * 路由的消费者 1
 * 
 * @author zhang
 *
 */
public class SubScribeDriectRec1 {
	public static final String EXCHANGE_NAME = "test_exchange_direct";
	public static final String DIRECT_NAME1 = "direct_1";

	public static void main(String[] args) throws IOException, TimeoutException {
		// 连接
		Connection connect = ConnectHelp.getConnect();

		// 获取通道
		final Channel channel = connect.createChannel();

		// 创建队列
		channel.queueDeclare(DIRECT_NAME1, false, false, false, null);
		// 绑定队列
		channel.queueBind(DIRECT_NAME1, EXCHANGE_NAME, "error");

		// 一次就接受一个值
		channel.basicQos(1);

		// 接收数据
		DefaultConsumer consumer = new DefaultConsumer(channel) {
			@Override
			public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
					throws IOException {

				String msg = new String(body, "utf-8");
				System.out.println("路由的消费者 1:" + msg);
				channel.basicAck(envelope.getDeliveryTag(), false);
			}
		};

		// 监听队列
		channel.basicConsume(DIRECT_NAME1, false, consumer);

	}
}

消费者2

/**
 * 路由的消费者 1
 * 
 * @author zhang
 *
 */
public class SubScribeDriectRec2 {
	public static final String EXCHANGE_NAME = "test_exchange_direct";
	public static final String DIRECT_NAME2 = "direct_2";

	public static void main(String[] args) throws IOException, TimeoutException {
		// 连接
		Connection connect = ConnectHelp.getConnect();

		// 获取通道
		final Channel channel = connect.createChannel();

		// 创建队列
		channel.queueDeclare(DIRECT_NAME2, false, false, false, null);
		// 绑定队列
		channel.queueBind(DIRECT_NAME2, EXCHANGE_NAME, "error");
		channel.queueBind(DIRECT_NAME2, EXCHANGE_NAME, "successful");

		// 一次就接受一个值
		channel.basicQos(1);

		// 接收数据
		DefaultConsumer consumer = new DefaultConsumer(channel) {
			@Override
			public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
					throws IOException {

				String msg = new String(body, "utf-8");
				System.out.println("路由的消费者 2:" + msg);
				channel.basicAck(envelope.getDeliveryTag(), false);
			}
		};

		// 监听队列
		channel.basicConsume(DIRECT_NAME2, false, consumer);

	}
}