RabbitMQ之订阅模式简介
一个生产者,多个消费者
每一个消费者都有自己的队列
生产者没有直接将消息发送到队列中去,而是发送到了交换机或者转发器(exchange)中
每个队列都要绑定到交换机上
生产者发送的消息,经过交互机到达队列就能实现一个消息被多个消费者消费
代码参考
生产者
/**
* 订阅模式
*
* @author zhang
*
* 一个生产者,多个消费者 每一个消费者都有自己的队列 生产者没有直接将消息发送到队列中去,而是发送到了交换机或者转发器(exchange)中
* 每个队列都要绑定到交换机上 生产者发送的消息,经过交互机到达队列就能实现一个消息被多个消费者消费
*
*
*/
public class SubScribeSend {
public static final String EXCHANGE_NAME = "test_exchange";
public static void main(String[] args) throws IOException, TimeoutException {
// 连接
Connection connect = ConnectHelp.getConnect();
// 获取通道
Channel channel = connect.createChannel();
// 创建一个交互机
channel.exchangeDeclare(EXCHANGE_NAME, "fanout");// 分发
// 消息
String msg = "send a msg;";
channel.basicPublish(EXCHANGE_NAME, "", null, msg.getBytes());
System.out.println("交互机发送数据:" + msg);
channel.close();
connect.close();
}
}
消费者1
/**
* 订阅 消费者1
*
* @author zhang
*
*/
public class SubScribeRec1 {
public static final String EXCHANGE_NAME = "test_exchange";
public static final String QUEUE_NAME = "test_queue_1";
public static void main(String[] args) throws IOException, TimeoutException {
// 连接
Connection connect = ConnectHelp.getConnect();
// 获取通道
Channel channel = connect.createChannel();
// 创建队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 绑定队列
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "");
// 只接受一个
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);
System.out.println("订阅1 :" + msg);
}
};
// 监听数据
channel.basicConsume(QUEUE_NAME, false, consumer);
}
}
消费者2
/**
* 订阅 消费者1
*
* @author zhang
*
*/
public class SubScribeRec2 {
public static final String EXCHANGE_NAME = "test_exchange";
public static final String QUEUE_NAME = "test_queue_2";
public static void main(String[] args) throws IOException, TimeoutException {
// 连接
Connection connect = ConnectHelp.getConnect();
// 获取通道
Channel channel = connect.createChannel();
// 创建队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 绑定队列
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "");
// 只接受一个
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);
System.out.println("订阅2:" + msg);
}
};
// 监听数据
channel.basicConsume(QUEUE_NAME, false, consumer);
}
}