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