rabbitmq工作模式詳解之路由模式-routing

rabbitmq工作模式詳解之路由模式-routing

嚴(yán)格按照消息的路由將消息發(fā)送至對應(yīng)的隊(duì)列咽弦,監(jiān)聽器監(jiān)聽各自的隊(duì)列消費(fèi)消息胁出,可以使用direct類型交換機(jī),使用topic類型交換機(jī)也可以實(shí)現(xiàn)全蝶,我這里還是使用topic寺枉,因?yàn)樗δ芎軓?qiáng)大


rabbitmq-路由模式.png

使用topic實(shí)現(xiàn)路由模式的時(shí)候要注意使用*和#通配符帶來的風(fēng)險(xiǎn)型凳,確保消息路由的準(zhǔn)確性

package com.gitee.small.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class TopicRabbitConfig {

    //綁定鍵
    public final static String DOG = "topic.dog";
    public final static String CAT = "topic.cat";


    /**
     * Queue構(gòu)造函數(shù)參數(shù)說明
     * new Queue(SMS_QUEUE, true);
     * 1. 隊(duì)列名
     * 2. 是否持久化 true:持久化 false:不持久化
     */


    @Bean
    public Queue firstQueue() {
        return new Queue(TopicRabbitConfig.DOG);
    }

    @Bean
    public Queue secondQueue() {
        return new Queue(TopicRabbitConfig.CAT);
    }

    @Bean
    public TopicExchange exchange() {
        return new TopicExchange("topicExchange");
    }


    /**
     * 將firstQueue和topicExchange綁定,而且綁定的鍵值為topic.dog
     * 這樣只要是消息攜帶的路由鍵是topic.dog,才會分發(fā)到該隊(duì)列
     */
    @Bean(name = "binding.dog")
    public Binding bindingExchangeMessage() {
        return BindingBuilder.bind(firstQueue()).to(exchange()).with(DOG);
    }

    /**
     * 將secondQueue和topicExchange綁定,而且綁定的鍵值為用上通配路由鍵規(guī)則topic.cat
     */
    @Bean(name = "binding.cat")
    public Binding bindingExchangeMessage2() {
        return BindingBuilder.bind(secondQueue()).to(exchange()).with(CAT);
    }
}

由于我之前一直是在用同一個交換機(jī)和隊(duì)列演示,所以在進(jìn)行路由模式演示之前要先將topic.cat隊(duì)列和topic.#路由解綁

手動解綁:登錄rabbitmq客戶端往弓,到exchanges標(biāo)簽下根據(jù)virtual host和交換機(jī)名稱找到對應(yīng)交換機(jī)蓄氧,再找到binging信息,點(diǎn)擊unbind手動解綁

rabbitmq手動解綁.png

rabbitAdmin.removeBinding自動解綁:

RabbitAdmin rabbitAdmin = new RabbitAdmin(rabbitTemplate);
// 怎么綁定的就怎么解綁
rabbitAdmin.removeBinding(BindingBuilder.bind(new Queue("topic.cat"))
                          .to(new TopicExchange("topicExchange")).with("topic.#"));

消息發(fā)送直接選擇rabbitTemplate即可

rabbitTemplate.convertAndSend("topicExchange", "topic.dog", "路由模式測試-dog");
rabbitTemplate.convertAndSend("topicExchange", "topic.cat", "路由模式測試-cat");

監(jiān)聽器示例

package com.gitee.small.rabbitmq;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class RoutingRabbitReceiver {


    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "topic.dog"),
            exchange = @Exchange(value = "bindingExchangeMessage", type = ExchangeTypes.TOPIC)
    ))
    public void process(String msg) {
        log.info("dog-收到消息:{}", msg);
    }

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "topic.cat"),
            exchange = @Exchange(value = "bindingExchangeMessage2", type = ExchangeTypes.TOPIC)
    ))
    public void  process2(String msg){
        log.info("cat-收到消息:{}", msg);
    }
}

結(jié)果示例

c.g.s.rabbitmq.RoutingRabbitReceiver     : dog-收到消息:路由模式測試-dog
c.g.s.rabbitmq.RoutingRabbitReceiver     : cat-收到消息:路由模式測試-cat
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者堂氯。
  • 序言:七十年代末咽白,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子晶框,更是在濱河造成了極大的恐慌,老刑警劉巖蹲蒲,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侵贵,死亡現(xiàn)場離奇詭異,居然都是意外死亡咖祭,警方通過查閱死者的電腦和手機(jī)蔫骂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浩嫌,“玉大人,你說我怎么就攤上這事码耐。” “怎么了敦间?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵束铭,是天一觀的道長。 經(jīng)常有香客問我契沫,道長,這世上最難降的妖魔是什么拴清? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任会通,我火速辦了婚禮,結(jié)果婚禮上苹威,老公的妹妹穿的比我還像新娘驾凶。我一直安慰自己,他們只是感情好调违,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布技肩。 她就那樣靜靜地躺著,像睡著了一般虚婿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上至朗,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天剧浸,我揣著相機(jī)與錄音矗钟,去河邊找鬼嫌变。 笑死,一個胖子當(dāng)著我的面吹牛腾啥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播软啼,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼延柠,長吁一口氣:“原來是場噩夢啊……” “哼锣披!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起增热,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤胧辽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后摄咆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體人断,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年涩金,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了暇仲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡全度,死狀恐怖桅狠,靈堂內(nèi)的尸體忽然破棺而出轿秧,到底是詐尸還是另有隱情咨堤,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布驱还,位于F島的核電站,受9級特大地震影響议蟆,放射性物質(zhì)發(fā)生泄漏萎战。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一戳粒、第九天 我趴在偏房一處隱蔽的房頂上張望虫啥。 院中可真熱鬧,春花似錦涂籽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至耐薯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間体谒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工抒痒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颁褂,地道東北人傀广。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓彩届,卻偏偏與公主長得像,于是被迫代替她去往敵國和親贮聂。 傳聞我的和親對象是個殘疾皇子寨辩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容