国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【RabbitMQ六】——RabbitMQ主題模式(Topic)

這篇具有很好參考價(jià)值的文章主要介紹了【RabbitMQ六】——RabbitMQ主題模式(Topic)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

通過本篇博客能夠簡單使用RabbitMQ的主題模式。
本篇博客主要是博主通過官網(wǎng)總結(jié)出的RabbitMQ主題模式。其中如果有誤歡迎大家及時(shí)指正。

什么是Topic模式

Topic模式與Direct模式相比,他們都可以根據(jù)Routing key把消息路由到對(duì)應(yīng)的隊(duì)列上,但是Topic模式相較于Direct來說,它可以基于多個(gè)標(biāo)準(zhǔn)進(jìn)行路由。也就是在隊(duì)列綁定Routing key的時(shí)候使用通配符。這使我們相較于Direct模式靈活性更大。

使用Topic模式的要點(diǎn)

routing key必須是由"."進(jìn)行分隔的單詞列表,最大限制為255字節(jié)

通配符規(guī)則

  • "*"可以代替一個(gè)單詞。
  • "#"可以代替零個(gè)或多個(gè)單詞。

示例

創(chuàng)建了三個(gè)綁定:Q1綁定了綁定鍵“.orange”。和Q2的".*.rabbit"和“l(fā)azy.#”。
rabbitmq topic模式,# 《消息中間件》,微服務(wù),java-rabbitmq,rabbitmq,java,微服務(wù)

1.一個(gè)消息的路由鍵為"quick.orange.rabbit" 時(shí),它將會(huì)被送到隊(duì)列Q1和Q2。
2.一個(gè)消息的路由鍵為"quick.orange.fox"時(shí),它將會(huì)背誦到隊(duì)列Q1
3.一個(gè)消息的路由鍵為"lazy.brown.fox"時(shí),它將被送到隊(duì)列Q2
4.一個(gè)消息的路由鍵為"quick.brown.fox",沒有匹配任何隊(duì)列,消息將會(huì)丟失。
5.一個(gè)消息的路由鍵為"lazy.orange.new.rabbit",它將被送到隊(duì)列Q2.
6.一個(gè)消息的路由鍵為"orang"或者"quick.orange.new.rabbit"沒有匹配到任何隊(duì)列消息將丟失。

代碼示例

Pom文件引入RabbtiMQ依賴

<dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
            <version>5.10.0</version>
        </dependency>

RabbitMQ工具類

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @author : [WangWei]
 * @version : [v1.0]
 * @className : RabbitMQUtils
 * @description : [rabbitmq工具類]
 * @createTime : [2023/1/17 8:49]
 * @updateUser : [WangWei]
 * @updateTime : [2023/1/17 8:49]
 * @updateRemark : [描述說明本次修改內(nèi)容]
 */
public class RabbitMQUtils {

    /*
     * @version V1.0
     * Title: getConnection
     * @author Wangwei
     * @description 創(chuàng)建rabbitmq連接
     * @createTime  2023/1/17 8:52
     * @param []
     * @return com.rabbitmq.client.Connection
     */
    public static Connection getConnection() throws IOException, TimeoutException {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("ip");
        factory.setPort(5672);
        factory.setVirtualHost("虛擬主機(jī)");
        factory.setUsername("用戶名");
        factory.setPassword("密碼");
        //創(chuàng)建連接
        Connection connection=factory.newConnection();
        return  connection;
    }

    /*
     * @version V1.0
     * Title: getChannel
     * @author Wangwei
     * @description 創(chuàng)建信道
     * @createTime  2023/1/17 8:55
     * @param []
     * @return com.rabbitmq.client.Channel
     */
    public static Channel getChannel() throws IOException, TimeoutException {
        Connection connection=getConnection();
        Channel channel=connection.createChannel();
        return channel;
    }
}



生產(chǎn)者

import com.rabbitmq.client.Channel;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeoutException;

/**
 * @author : [WangWei]
 * @version : [v1.0]
 * @className : Producer
 * @description : [生產(chǎn)者]
 * @createTime : [2023/2/1 9:38]
 * @updateUser : [WangWei]
 * @updateTime : [2023/2/1 9:38]
 * @updateRemark : [描述說明本次修改內(nèi)容]
 */
public class Producer {
    private static final String EXCHANGE_NAME = "topic_logs";

    public static void main(String[] args) throws IOException, TimeoutException {
        //建立連接
        RabbitMQUtils.getConnection();
        //聲明通道
        Channel channel = RabbitMQUtils.getChannel();
        //創(chuàng)建topic類型交換機(jī)并命名為logs
        channel.exchangeDeclare(EXCHANGE_NAME,"topic");

        //聲明routingKey
        String severityInfo="info.log.test";
        String severityError="error.test";
        String severityError2="log.error.test";
        //循環(huán)發(fā)送2條消息
        for (int i = 0; i <2 ; i++) {
            String msg="info.log.test:"+i;
            /*推送消息
             *交換機(jī)命名,不填寫使用默認(rèn)的交換機(jī)
             * routingKey -路由鍵-
             * props:消息的其他屬性-路由頭等正文
             * msg消息正文
             */
            channel.basicPublish(EXCHANGE_NAME,severityInfo,null,msg.getBytes(StandardCharsets.UTF_8));
            System.out.println(msg);
        }
        //循環(huán)發(fā)送2條消息
        for (int i = 0; i <2 ; i++) {
            String msg="主題模式error.test:"+i;
            /*推送消息
             *交換機(jī)命名,不填寫使用默認(rèn)的交換機(jī)
             * routingKey -路由鍵-
             * props:消息的其他屬性-路由頭等正文
             * msg消息正文
             */
            channel.basicPublish(EXCHANGE_NAME,severityError,null,msg.getBytes(StandardCharsets.UTF_8));
            System.out.println(msg);
        }
        //循環(huán)發(fā)送2條消息
        for (int i = 0; i <2 ; i++) {
            String msg="log.error.test:"+i;
            /*推送消息
             *交換機(jī)命名,不填寫使用默認(rèn)的交換機(jī)
             * routingKey -路由鍵-
             * props:消息的其他屬性-路由頭等正文
             * msg消息正文
             */
            channel.basicPublish(EXCHANGE_NAME,severityError2,null,msg.getBytes(StandardCharsets.UTF_8));
            System.out.println(msg);
        }
    }
}

消費(fèi)者1

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @author : [WangWei]
 * @version : [v1.0]
 * @className : ConsumerOne
 * @description : [消費(fèi)者1]
 * @createTime : [2023/2/1 9:39]
 * @updateUser : [WangWei]
 * @updateTime : [2023/2/1 9:39]
 * @updateRemark : [描述說明本次修改內(nèi)容]
 */
public class ConsumerOne {
    private static final String EXCHANGE_NAME = "topic_logs";

    public static void main(String[] args) throws IOException, TimeoutException {
        RabbitMQUtils.getConnection();
        Channel channel = RabbitMQUtils.getChannel();

        channel.exchangeDeclare(EXCHANGE_NAME,"topic");
        String queueName = channel.queueDeclare().getQueue();
        //聲明routingKey (error)
        String severityError="error.*";
        //交換機(jī)與隊(duì)列進(jìn)行綁定-如果沒有隊(duì)列與交換機(jī)進(jìn)行綁定,那么消費(fèi)者接受不到生產(chǎn)者的消息,消息會(huì)丟失
        //queueName綁定了direct_logs交換機(jī)并且綁定了routingKey
        channel.queueBind(queueName, EXCHANGE_NAME,severityError );

        //因?yàn)镽abbitmq服務(wù)器將異步地向我們推送消息,所以我們以對(duì)象的形式提供了一個(gè)回調(diào),該回調(diào)將緩沖消息,直到我們準(zhǔn)備好使用它們。
        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
            String message = new String(delivery.getBody(), "UTF-8");
            System.out.println(" [x] Received '" + message + "'");
        };
        channel.basicConsume(queueName, true, deliverCallback, consumerTag -> { });
    }
}

消費(fèi)者2

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @author : [WangWei]
 * @version : [v1.0]
 * @className : ConsumerTwo
 * @description : [消費(fèi)者2]
 * @createTime : [2023/2/1 9:38]
 * @updateUser : [WangWei]
 * @updateTime : [2023/2/1 9:38]
 * @updateRemark : [描述說明本次修改內(nèi)容]
 */
public class ConsumerTwo {
    private static final String EXCHANGE_NAME = "topic_logs";

    public static void main(String[] args) throws IOException, TimeoutException {
        RabbitMQUtils.getConnection();
        Channel channel = RabbitMQUtils.getChannel();
        //創(chuàng)建fanout類型交換機(jī)并命名為logs
        channel.exchangeDeclare(EXCHANGE_NAME,"topic");
        //創(chuàng)建了一個(gè)非持久的、排他的、自動(dòng)刪除的隊(duì)列,并生成了一個(gè)名稱
        String queueName = channel.queueDeclare().getQueue();
        //聲明routingKey (info,error,warning)
        String severityInfo="info.#";
        String severityError="*.error.*";
        //交換機(jī)與隊(duì)列進(jìn)行綁定-如果沒有隊(duì)列與交換機(jī)進(jìn)行綁定,那么消費(fèi)者接受不到生產(chǎn)者的消息,消息會(huì)丟失
        //queueName綁定了direct_logs交換機(jī)并且綁定了3個(gè)routingKey
        channel.queueBind(queueName, EXCHANGE_NAME,severityInfo );
        channel.queueBind(queueName, EXCHANGE_NAME,severityError );
        //因?yàn)镽abbitmq服務(wù)器將異步地向我們推送消息,所以我們以對(duì)象的形式提供了一個(gè)回調(diào),該回調(diào)將緩沖消息,直到我們準(zhǔn)備好使用它們。
        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
            String message = new String(delivery.getBody(), "UTF-8");
            System.out.println(" [x] Received '" + message + "'");
        };
        channel.basicConsume(queueName, true, deliverCallback, consumerTag -> { });
    }

}

效果

rabbitmq topic模式,# 《消息中間件》,微服務(wù),java-rabbitmq,rabbitmq,java,微服務(wù)
rabbitmq topic模式,# 《消息中間件》,微服務(wù),java-rabbitmq,rabbitmq,java,微服務(wù)
rabbitmq topic模式,# 《消息中間件》,微服務(wù),java-rabbitmq,rabbitmq,java,微服務(wù)

總結(jié)

通過使用通配符實(shí)現(xiàn)靈活性的應(yīng)用有很多,例如nginx的請(qǐng)求轉(zhuǎn)發(fā),gateway為請(qǐng)求過濾等等都是使用了統(tǒng)配符的技術(shù)。通過這種聯(lián)想來對(duì)知識(shí)進(jìn)行結(jié)構(gòu)化,找相同和不同,思考能力和學(xué)習(xí)力也會(huì)有很大的提高。文章來源地址http://www.zghlxwxcb.cn/news/detail-696423.html

到了這里,關(guān)于【RabbitMQ六】——RabbitMQ主題模式(Topic)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • RabbitMq:Topic exchange(主題交換機(jī))的理解和使用

    RabbitMq:Topic exchange(主題交換機(jī))的理解和使用

    在RabbitMq中,生產(chǎn)者的消息都是通過交換機(jī)來接收,然后再從交換機(jī)分發(fā)到不同的隊(duì)列中去,在分發(fā)的過程中交換機(jī)類型會(huì)影響分發(fā)的邏輯,下面主要講解一下主題交換機(jī)。 ? 主題交換機(jī)核心是可以以范圍的行為向隊(duì)列發(fā)送消息,它和直連交換機(jī)區(qū)別在于,直連交換機(jī)一個(gè)隊(duì)

    2024年02月12日
    瀏覽(21)
  • RabbitMQ入門案例之Topic模式

    RabbitMQ入門案例之Topic模式

    本文章將介紹RabbitMQ中的Topic(主題)模式,其中還會(huì)涉及 ‘#’ 和 ‘*’ 兩個(gè)通配符在RabbitMQ中的區(qū)別。 官網(wǎng)文檔地址:https://rabbitmq.com/getstarted.html RabbitMQ的Topic模式是一種基于主題的消息傳遞模式。它允許發(fā)送者向一個(gè)特定的主題(topic)發(fā)布消息,同時(shí),訂閱者也可以針

    2024年02月10日
    瀏覽(25)
  • RabbitMQ 發(fā)布訂閱模式,routing路由模式,topic模式

    RabbitMQ 發(fā)布訂閱模式,routing路由模式,topic模式

    發(fā)布訂閱模式 一個(gè)消息可以由多個(gè)消費(fèi)者消費(fèi)同一個(gè)消息 ?消費(fèi)者1和2同時(shí)消費(fèi)了該消息 舉例 ?消費(fèi)者1和2同時(shí)消費(fèi)了該消息,比如說消息是發(fā)短信,發(fā)郵件,? 那么1和發(fā)短息? 2可以發(fā)郵件 routing路由模式 就是說哪些讓誰干 哪些讓誰干區(qū)分出來 也可以讓所有消費(fèi)者都消費(fèi) 選擇

    2024年02月02日
    瀏覽(23)
  • RabbitMQ學(xué)習(xí)——發(fā)布訂閱/fanout模式 & topic模式 & rabbitmq回調(diào)確認(rèn) & 延遲隊(duì)列(死信)設(shè)計(jì)

    RabbitMQ學(xué)習(xí)——發(fā)布訂閱/fanout模式 & topic模式 & rabbitmq回調(diào)確認(rèn) & 延遲隊(duì)列(死信)設(shè)計(jì)

    1.rabbitmq隊(duì)列方式的梳理,點(diǎn)對(duì)點(diǎn),一對(duì)多; 2.發(fā)布訂閱模式,交換機(jī)到消費(fèi)者,以郵箱和手機(jī)驗(yàn)證碼為例; 3.topic模式,根據(jù)規(guī)則決定發(fā)送給哪個(gè)隊(duì)列; 4.rabbitmq回調(diào)確認(rèn),setConfirmCallback和setReturnsCallback; 5.死信隊(duì)列,延遲隊(duì)列,創(chuàng)建方法,正?!佬?,設(shè)置延遲時(shí)間; 點(diǎn)對(duì)

    2024年02月13日
    瀏覽(92)
  • RabbitMQ基礎(chǔ)(2)——發(fā)布訂閱/fanout模式 & topic模式 & rabbitmq回調(diào)確認(rèn) & 延遲隊(duì)列(死信)設(shè)計(jì)

    RabbitMQ基礎(chǔ)(2)——發(fā)布訂閱/fanout模式 & topic模式 & rabbitmq回調(diào)確認(rèn) & 延遲隊(duì)列(死信)設(shè)計(jì)

    1.rabbitmq隊(duì)列方式的梳理,點(diǎn)對(duì)點(diǎn),一對(duì)多; 2.發(fā)布訂閱模式,交換機(jī)到消費(fèi)者,以郵箱和手機(jī)驗(yàn)證碼為例; 3.topic模式,根據(jù)規(guī)則決定發(fā)送給哪個(gè)隊(duì)列; 4.rabbitmq回調(diào)確認(rèn),setConfirmCallback和setReturnsCallback; 5.死信隊(duì)列,延遲隊(duì)列,創(chuàng)建方法,正?!佬牛O(shè)置延遲時(shí)間; 點(diǎn)對(duì)

    2024年02月10日
    瀏覽(98)
  • RabbitMQ: topic 結(jié)構(gòu)

    RabbitMQ: topic 結(jié)構(gòu)

    2024年02月09日
    瀏覽(12)
  • Kafka - 主題Topic與消費(fèi)者消息Offset日志記錄機(jī)制

    Kafka - 主題Topic與消費(fèi)者消息Offset日志記錄機(jī)制

    可以根據(jù)業(yè)務(wù)類型,分發(fā)到不同的Topic中,對(duì)于每一個(gè)Topic,下面可以有多個(gè)分區(qū)(Partition)日志文件: kafka 下的Topic的多個(gè)分區(qū),每一個(gè)分區(qū)實(shí)質(zhì)上就是一個(gè)隊(duì)列,將接收到的消息暫時(shí)存儲(chǔ)到隊(duì)列中,根據(jù)配置以及消息消費(fèi)情況來對(duì)隊(duì)列消息刪除。 可以這么來理解Topic,Partitio

    2024年02月03日
    瀏覽(23)
  • RabbitMQ交換機(jī)(3)-Topic

    RabbitMQ交換機(jī)(3)-Topic

    RabbitMQ的Topic模式是一種基于主題的消息傳遞模式。它允許發(fā)送者向一個(gè)特定的主題(topic)發(fā)布消息,同時(shí),訂閱者也可以針對(duì)自己感興趣的主題進(jìn)行訂閱。 在Topic模式中, 主題通過一個(gè)由單詞和點(diǎn)號(hào)組成的字符串 來描述。例如,“#.china”表示匹配所有以“china”為結(jié)尾的

    2024年01月19日
    瀏覽(15)
  • rabbitmq基礎(chǔ)-java-5、Topic交換機(jī)

    rabbitmq基礎(chǔ)-java-5、Topic交換機(jī)

    Topic 類型的 Exchange 與 Direct 相比,都是可以根據(jù) RoutingKey 把消息路由到不同的隊(duì)列。 只不過 Topic 類型 Exchange 可以讓隊(duì)列在綁定 BindingKey 的時(shí)候使用通配符! BindingKey 一般都是有一個(gè)或多個(gè)單詞組成,多個(gè)單詞之間以 . 分割,例如: item.insert 通配符規(guī)則: # :匹配一個(gè)或多個(gè)

    2024年01月25日
    瀏覽(22)
  • 消息中間件學(xué)習(xí)筆記--RabbitMQ(二、模式,一次違反常規(guī)的Java大廠面試經(jīng)歷

    消息中間件學(xué)習(xí)筆記--RabbitMQ(二、模式,一次違反常規(guī)的Java大廠面試經(jīng)歷

    .Fanout:轉(zhuǎn)發(fā)消息到所有綁定隊(duì)列 比較常用的是Direct、Topic、Fanout. Fanout 這種Fanout模式不處理路由鍵,只·需要簡單的將隊(duì)列綁定到exchange上,一個(gè)發(fā)送到exchange的消息都會(huì)被轉(zhuǎn)發(fā)到與該exchange綁定的所有隊(duì)列上。很像廣播子網(wǎng),每臺(tái)子網(wǎng)內(nèi)的主機(jī)都獲得了一份復(fù)制的消息。Fan

    2024年04月09日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包