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收到的消息個數不同。後續嘗試幾次,結論正常