文章目錄
- RabbitMQ 學習(五)---- Fanout 廣播模型
- (1)消息發送流程
- (2)生産者
- (3)消費者
- (4)檢視效果
RabbitMQ 學習(五)---- Fanout 廣播模型
這種廣播模式很像,就是生産者把通知的内容都錄音到電台(exange)裡,消費者如果想要聽到,必須使用該頻率的耳機(queue 綁定 exange)去聽才能收到。所有消費者隻要通過一個隊列進行綁定,那麼都能聽到,都能消費該資訊,這就是廣播模式。
(1)消息發送流程
在廣播模式下,消息發送流程是這樣的:
- 可以有多個消費者
- 每個消費者有自己的queue(隊列)
- 每個隊列都要綁定到Exchange(交換機)
- 生産者發送的消息,隻能發送到交換機,交換機來決定要發給哪個隊列,生産者無法決定。
- 交換機把消息發送給綁定過的所有隊列
- 隊列的消費者都能拿到消息。實作一條消息被多個消費者消費
(2)生産者
- 聲明交換機(名字+類型)
- 生産者使用信道發送消息到交換機中
package fanout;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.MessageProperties;
import utils.RabbitMQUtils;
import java.io.IOException;
public class FProvider {
public static void main(String[] args) {
Connection connection = RabbitMQUtils.getConnect();
Channel channel = null;
try {
// 建立信道
channel = connection.createChannel();
// 聲明交換機
channel.exchangeDeclare("exch", "fanout");
String body = "廣播模式發送消息!";
// 信道使用交換機接收發送的消息,routineKey在這種廣播模式下用不到
channel.basicPublish("exch", "", MessageProperties.PERSISTENT_TEXT_PLAIN, body.getBytes());
} catch (IOException e) {
e.printStackTrace();
}finally {
RabbitMQUtils.close(channel,connection);
}
}
}
(3)消費者
- 聲明交換機
- 聲明臨時隊列
- 臨時隊列監聽交換機
- 消費者使用隊列接收消息
消費者1
package fanout;
import com.rabbitmq.client.*;
import utils.RabbitMQUtils;
import java.io.IOException;
public class FCustomer1 {
public static void main(String[] args) {
Connection connection = RabbitMQUtils.getConnect();
try {
Channel channel = connection.createChannel();
// 聲明交換機,與生産者一緻
channel.exchangeDeclare("exch", "fanout");
// 聲明臨時隊列
String queue = channel.queueDeclare().getQueue();
// 交換機與隊列進行綁定,臨時隊列綁定交換機才能聽到廣播的内容,routingKey不起作用
channel.queueBind(queue, "exch", "");
// 使用臨時隊列接收 生産者在交換機中 廣播的消息
channel.basicConsume(queue, false, new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println(new String(body));;
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
}
消費者2 的代碼與上面一模一樣
(4)檢視效果
FProvider 發送消息到交換機 “exch” 中
消費者1 臨時隊列綁定交換機,信道通過隊列 收到消息
消費者2 臨時隊列綁定交換機,信道通過隊列 收到消息
此時在背景中檢視 交換機的綁定情況,兩個臨時隊列綁定交換機