RabbitMQ之路由模式

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);

	}
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值