rabbitmq 发布订阅订阅模式
尝试使用fanout模式进行发送。
具体操作步骤如下
发送端
准备10条消息
ConnectionFactory connectionFactory = connectionFactory();
Connection connection = connectionFactory.newConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare(EXCHANGE_01, BuiltinExchangeType.FANOUT);
for (int i = 0; i < 10; i++) {
byte[] body = ("张三,你好,"+i).getBytes();
channel.basicPublish(EXCHANGE_01, "", MessageProperties.PERSISTENT_TEXT_PLAIN, body);
}
接收端1
ConnectionFactory connectionFactory = connectionFactory();
Connection connection = connectionFactory.newConnection();
Channel channel = connection.createChannel();
//申明交换机、队列、绑定关系
channel.exchangeDeclare(EXCHANGE_01, BuiltinExchangeType.FANOUT);
channel.queueDeclare(QUEUE_01,true,false,false,null);
channel.queueBind(QUEUE_01,EXCHANGE_01,"");
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println(" [x] Received '" + message + "'");
};
channel.basicConsume(QUEUE_01, true, deliverCallback, consumerTag -> { });
接收端2
ConnectionFactory connectionFactory = connectionFactory();
Connection connection = connectionFactory.newConnection();
Channel channel = connection.createChannel();
//申明交换机、队列、绑定关系
channel.exchangeDeclare(EXCHANGE_01, BuiltinExchangeType.FANOUT);
channel.queueDeclare(QUEUE_02,true,false,false,null);
channel.queueBind(QUEUE_02, EXCHANGE_01, "");
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println(" [x] Received '" + message + "'");
};
channel.basicConsume(QUEUE_02, true, deliverCallback, consumerTag -> {
});
队列模型图
运行结果-并非把所有消息发送到两个消息费
消费端1
## 消费端2
结论
可以正确的把消息广播到两个消费者。
遗留小问题:之前尝试几次发送,消费者1和消费者2收到的消息个数不同。后续尝试几次,结论正常