天天看點

RabbitMQ 學習(五)---- Fanout 廣播模型

文章目錄

  • ​​RabbitMQ 學習(五)---- Fanout 廣播模型​​
  • ​​(1)消息發送流程​​
  • ​​(2)生産者​​
  • ​​(3)消費者​​
  • ​​(4)檢視效果​​

RabbitMQ 學習(五)---- Fanout 廣播模型

  這種廣播模式很像,就是生産者把通知的内容都錄音到電台(exange)裡,消費者如果想要聽到,必須使用該頻率的耳機(queue 綁定 exange)去聽才能收到。所有消費者隻要通過一個隊列進行綁定,那麼都能聽到,都能消費該資訊,這就是廣播模式。

(1)消息發送流程

RabbitMQ 學習(五)---- Fanout 廣播模型

在廣播模式下,消息發送流程是這樣的:

  • 可以有多個消費者
  • 每個消費者有自己的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” 中

RabbitMQ 學習(五)---- Fanout 廣播模型

消費者1 臨時隊列綁定交換機,信道通過隊列 收到消息

RabbitMQ 學習(五)---- Fanout 廣播模型

消費者2 臨時隊列綁定交換機,信道通過隊列 收到消息

RabbitMQ 學習(五)---- Fanout 廣播模型

此時在背景中檢視 交換機的綁定情況,兩個臨時隊列綁定交換機

繼續閱讀