色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

RabbitMQ中的發(fā)布訂閱模型

科技綠洲 ? 來源:Java技術指北 ? 作者:Java技術指北 ? 2023-09-25 14:30 ? 次閱讀

上一篇文章中,簡單的介紹了一下RabbitMQ的work模型。這篇文章來學習一下RabbitMQ中的發(fā)布訂閱模型。

發(fā)布訂閱模型(Publish/Subscribe):簡單的說就是隊列里面的消息會被多個消費者同時接受到,消費者接收到的信息一致。

發(fā)布訂閱模型適合于做模塊之間的異步通信

圖片
img

適用場景

  1. 發(fā)送并記錄日志信息
  2. springcloud的config組件里面通知配置自動更新
  3. 緩存同步
  4. 微信訂閱號

演示

生產(chǎn)者

public class Producer {
    private static final String EXCHANGE_NAME = "exchange_publish_1";

    public static void main(String[] args) throws IOException, TimeoutException {
        Connection connection = ConnectionUtils.getConnection();
        Channel channel = connection.createChannel();
        // 聲明交換機
        channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
        // 發(fā)送消息到交換機
        for (int i = 0; i < 100; i++) {
            channel.basicPublish(EXCHANGE_NAME, "", null, ("發(fā)布訂閱模型的第 " + i + " 條消息").getBytes());
        }
        // 關閉資源
        channel.close();
        connection.close();
    }
}

消費者

// 消費者1
public class Consumer {
    private static final String QUEUE_NAME = "queue_publish_1";
    private static final String EXCHANGE_NAME = "exchange_publish_1";

    public static void main(String[] args) throws IOException, TimeoutException {
        Connection connection = ConnectionUtils.getConnection();
        Channel channel = connection.createChannel();
        // 聲明隊列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        // 聲明交換機
        channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
        // 將隊列綁定到交換機
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "");
        DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("隊列1接收到的消息是:" + new String(body));
            }
        };
        channel.basicConsume(QUEUE_NAME, true, defaultConsumer);
    }
}
// 消費者2
public class Consumer2 {
    private static final String QUEUE_NAME = "queue_publish_2";
    private static final String EXCHANGE_NAME = "exchange_publish_1";

    public static void main(String[] args) throws IOException, TimeoutException {
        Connection connection = ConnectionUtils.getConnection();
        Channel channel = connection.createChannel();
        // 聲明隊列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        // 聲明交換機
        channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
        // 將隊列綁定到交換機
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "");
        DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("隊列2接收到的消息是:" + new String(body));
            }
        };
        channel.basicConsume(QUEUE_NAME, true, defaultConsumer);
    }
}

測試

先啟動2個消費者,再啟動生產(chǎn)者

圖片

圖片

可以看出來消費者1和消費者2接收到的消息是一模一樣的 ,每個消費者都收到了生產(chǎn)者發(fā)送的消息;

發(fā)布訂閱模型,用到了一個新的東西-交換機,這里也解釋一下相關方法的參數(shù)

// 聲明交換機
channel.exchangeDeclare(EXCHANGE_NAME, "fanout");

// 該方法的最多參數(shù)的重載方法是:
Exchange.DeclareOk exchangeDeclare(String exchange,
                                    BuiltinExchangeType type,
                                    boolean durable,
                                    boolean autoDelete,
                                    boolean internal,
                                    Map< String, Object > arguments) throws IOException;

/**
 *  param1:exchange,交換機名稱
 *  param2:type,交換機類型;直接寫 string效果一致;內(nèi)置了4種交換機類型:
 *   direct(路由模式)、fanout(發(fā)布訂閱模式)、
 *   topic(topic模式-模糊匹配)、headers(標頭交換,由Headers的參數(shù)分配,不常用)
 *  param3:durable,是否持久化交換機   false:默認值,不持久化
 *  param4:autoDelete,沒有消費者使用時,是否自動刪除交換機   false:默認值,不刪除
 *  param5:internal,是否內(nèi)置,如果設置 為true,則表示是內(nèi)置的交換器, 客戶端程序無法直接發(fā)送消息到這個交換器中, 只能通過交換器路由到交換器的方式  false:默認值,允許外部直接訪問
 *  param6:arguments,交換機的一些其他屬性,默認值為 null
 */
// 將隊列綁定到交換機
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "");
/**
 *  param1:destination,目的地,隊列的名字
 *  param2:source,資源,交換機的名字
 *  param3:routingKey,路由鍵(目前沒有用到routingKey,填 "" 即可)
 */

小結

本文到這里就結束了,介紹了RabbitMQ通信模型中的發(fā)布訂閱模型,適合于做模塊之間的異步通信。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 交換機
    +關注

    關注

    21

    文章

    2637

    瀏覽量

    99535
  • 緩存
    +關注

    關注

    1

    文章

    239

    瀏覽量

    26672
  • 模型
    +關注

    關注

    1

    文章

    3226

    瀏覽量

    48809
  • springcloud
    +關注

    關注

    0

    文章

    17

    瀏覽量

    1534
  • rabbitmq
    +關注

    關注

    0

    文章

    17

    瀏覽量

    1026
收藏 人收藏

    評論

    相關推薦

    RabbitMQ通信模型的work模型

    上一篇文章,簡單的介紹了一下RabbitMQ,以及安裝和hello world。 有的小伙伴留言說看不懂其中的方法參數(shù),這里先解釋一下幾個基本的方法參數(shù)。 // 聲明隊列方法
    的頭像 發(fā)表于 09-25 14:34 ?509次閱讀
    <b class='flag-5'>RabbitMQ</b>通信<b class='flag-5'>模型</b><b class='flag-5'>中</b>的work<b class='flag-5'>模型</b>

    RabbitMQ是什么

    在工作中經(jīng)常會用到消息隊列處理各種問題,今天指北君帶領大家來學一個很常用到的技術-RabbitMQ;接下來還會有關于RabbitMQ的系列教程,對你有幫助的話記得關注哦~ RabbitMQ
    的頭像 發(fā)表于 09-25 14:36 ?850次閱讀
    <b class='flag-5'>RabbitMQ</b>是什么

    MQTT協(xié)議介紹之一:發(fā)布/訂閱

    ,MQTT被正式批準為OASIS標準。 MQTT 3.1.1現(xiàn)在是該協(xié)議的最新版本。發(fā)布/訂閱模式發(fā)布/訂閱模式(pub / sub)是傳統(tǒng)客戶端 - 服務器
    發(fā)表于 08-25 19:58

    Redis的發(fā)布訂閱機制

    Redis之發(fā)布訂閱機制
    發(fā)表于 06-11 13:21

    MQTT的通信模型及消息

     MQTT通信模型    MQTT協(xié)議是基于客戶端-服務器模型,在協(xié)議主要有三種身份:發(fā)布者(Publisher)、服務器(Broker) 以及
    發(fā)表于 01-19 15:57

    NodeMCU實現(xiàn)訂閱發(fā)布主題

    NodeMCU實現(xiàn)訂閱發(fā)布主題。1、要點掃盲1.1 MQTT《MQTT協(xié)議--MQTT協(xié)議簡介及原理》《MQTT協(xié)議--MQTT協(xié)議解析》1.2 OneNET《NodeMCU學習(十)--發(fā)送數(shù)據(jù)
    發(fā)表于 11-01 08:37

    請問esp32c3,ble mesh怎么向訂閱的分組發(fā)布消息?

    發(fā)布消息,為什么vnd_models模型不可以.有沒有更加簡單的api,直接傳訂閱分組地址就可以發(fā)布消息的?
    發(fā)表于 02-13 06:47

    請問esp32c3 ble mesh怎么向訂閱的分組發(fā)布消息?

    發(fā)布消息,為什么vnd_models模型不可以.有沒有更加簡單的api,直接傳訂閱分組地址就可以發(fā)布消息的?
    發(fā)表于 03-06 08:36

    基于SOA的發(fā)布/訂閱系統(tǒng)設計

    企業(yè)電子商務的迅猛發(fā)展已經(jīng)改變了分布式系統(tǒng)的規(guī)模,傳統(tǒng)的基于請求/應答的點對 點、同步通信已不能滿足大規(guī)模動態(tài)分布式應用環(huán)境。基于SOA 的發(fā)布/訂閱系統(tǒng)模型
    發(fā)表于 07-08 08:42 ?21次下載

    RabbitMQ-CN RabbitMQ中文文檔

    RabbitMQ_into_Chinese.zip
    發(fā)表于 04-19 10:51 ?0次下載
    <b class='flag-5'>RabbitMQ</b>-CN <b class='flag-5'>RabbitMQ</b>中文文檔

    rabbitmq是什么?rabbitmq安裝、原理、部署

    rabbitmq是什么? MQ的全稱是Messagee Queue,因為消息的隊列是隊列,所以遵循FIFO 先進先出的原則是上下游傳遞信息的跨過程通信機制。 RabbitMQ是一套開源(MPL
    的頭像 發(fā)表于 07-19 13:50 ?1030次閱讀

    RocketMQ和RabbitMQ的區(qū)別

    RocketMQ和RabbitMQ的區(qū)別: 架構設計:RocketMQ是基于主題(Topic)的發(fā)布/訂閱模式,而RabbitMQ則是基于隊列(Queue)的消息代理系統(tǒng)。 語言支持
    的頭像 發(fā)表于 07-24 13:39 ?1.4w次閱讀

    Topic 模型的使用

    RabbitMQ 是一個流行的開源消息隊列軟件,它提供了多種通信模型,例如發(fā)布/訂閱模型、路由模型
    的頭像 發(fā)表于 09-25 11:30 ?661次閱讀

    RabbitMQ的路由模型(direct)

    路由模型 RabbitMQ 提供了五種不同的通信模型,上一篇文章,簡單的介紹了一下RabbitMQ發(fā)
    的頭像 發(fā)表于 09-25 11:32 ?495次閱讀

    redis和rabbitMQ的區(qū)別

    Redis和RabbitMQ之間的區(qū)別。 架構設計: Redis是一個內(nèi)存存儲系統(tǒng),它將數(shù)據(jù)存儲在內(nèi)存,以提供快速的讀寫訪問。因此,Redis的存儲能力受到內(nèi)存大小的限制。它使用發(fā)布/訂閱
    的頭像 發(fā)表于 12-04 14:48 ?1389次閱讀
    主站蜘蛛池模板: 秘密教学26我们在做一次吧免费 | 国产午夜伦伦伦午夜伦| 国精产品一区一区三区有限| 久久婷五月综合色啪首页| 日本G奶乳液汁| 亚洲人成人毛片无遮挡| 18禁国产精品久久久久久麻豆| 丰满少妇69激情啪啪无码| 精品高潮呻吟99AV无码| 人禽l交视频在线播放 视频| 亚洲色t图| 丰满女友bd高清在线观看| 久久99国产综合精品AV蜜桃| 日韩欧美一区二区三区在线| 亚洲天堂999| 高清午夜福利电影在线| 久久综合中文字幕佐佐木希| 甜涩性爱下载| 97在线视频免费| 黑人玩弄极品人妻系列| 情欲.美女高潮| 在教室轮流被澡高H林萌| 国产 精品 亚洲 欧美 高清| 噜噜噜在线AV免费观看看| 性生片30分钟| xxxxx俄罗斯| 久久学生精品国产自在拍| 婷婷四房播客五月天| 99日影院在线播放| 精品亚洲国产成AV人片传媒| 婷婷精品国产亚洲AV在线观看 | 强奸日本美女小游戏| 一区不卡二区卡| 国产精品免费一区二区三区视频| 男人吃奶摸下挵进去啪啪| 伊人激情综合网| 国产色婷婷精品人妻蜜桃成熟时 | 国产精品无码视频一区二区| 欧美Av无码高清在线| 伊人久久大香线蕉综合网站| 国产人成精品综合欧美成人|