Java RabbitMQ的三種Exchange模式
前言:
上一章講解RabbitMq的相關(guān)知識(shí)和如何使用Spring Boot集成Rabbitmq發(fā)送消息,本文將講解RabbitMQ三種Exchange模式。
簡(jiǎn)介
RabbitMQ的Exchange通常有三種模式分別為:Direct模式、Fanout模式、Topic模式。
Direct模式
Rabbit的Direct Exchange模式是指消息發(fā)送導(dǎo)RouteKey中指定的Queue,Direct模式可以使用Rabbit自帶的Exchange,所以不需要將Exchange進(jìn)行任何綁定。消息傳遞時(shí),RouteKey必須完全匹配,消息才會(huì)被隊(duì)列接收,否則消息將會(huì)被拋棄。
原理如下圖:
示例代碼:
可以參考上一章的示例代碼,本文就不在重復(fù)闡述。
Fanout Exchange
Fanout Exchange 模式不處理路由鍵,只需要簡(jiǎn)單的將隊(duì)列綁定到交換機(jī)上發(fā)送到交換機(jī)的消息都會(huì)被轉(zhuǎn)發(fā)到與該交換機(jī)綁定的所有隊(duì)列上。因此Fanout交換機(jī)轉(zhuǎn)發(fā)消息是最快的。
原理如下圖:
示例代碼
配置類(lèi)
@Configuration public class RabbmitFanoutConfig { private final static String FANOUT_QUEUE_1 = "fanoutQueue1"; //隊(duì)列名稱(chēng)1 private final static String EXCHANGE_NAME = "fanoutExchange"; //交換器名稱(chēng) @Bean public Queue queue1() { return new Queue(FANOUT_QUEUE_1); } @Bean public FanoutExchange fanoutExchange() { return new FanoutExchange(EXCHANGE_NAME); } @Bean public Binding bindingExchange1() { return BindingBuilder.bind(queue1()).to(fanoutExchange()); } }
生產(chǎn)者
@Component public class FanOutMqProduce { @Autowired private RabbitTemplate rabbitTemplate; public void sendMessage(String message) { rabbitTemplate.convertAndSend("fanoutExchange",null,message); } }
說(shuō)明:convertAndSend 第一個(gè)參數(shù)為Exchange的名稱(chēng),第二參數(shù)為routekey的名稱(chēng),由于Fanout不需要通過(guò)Routekey來(lái)綁定所以參數(shù)為空。
消費(fèi)者
@Component @RabbitListener(queues = "fanoutQueue1") public class FanOutMqConsumer { private static final Logger logger = LoggerFactory.getLogger(FanOutMqConsumer.class); @RabbitHandler public void receive(String message) { logger.info("receive message content:{}",message); } }
說(shuō)明:監(jiān)聽(tīng)隊(duì)列的名稱(chēng)與配置的隊(duì)列名稱(chēng)一致。
測(cè)試代碼
@RequestMapping("/sendFanOutMessage") public String sendFanOutMessage() { fanOutMqProduce.sendMessage("this is fanout message"); return "success"; }
運(yùn)行結(jié)果:
c.s.f.r.consumer.FanOutMqConsumer - receive message content:this is fanout message
Topic模式
Topic模式是通過(guò)Routing Key來(lái)進(jìn)行通配符匹配。
- 符號(hào)#代表可以匹配一個(gè)或多個(gè)詞
- 符號(hào)*代表只能匹配一個(gè)詞
原理如下圖:
說(shuō)明:例如:usa.#能夠匹配導(dǎo)usa.news.huofu,而europe.*只能匹配europe.news或者europe.weather
示例代碼
配置類(lèi)
@Configuration public class RabbmitTopicConfig { private final static String TOPIC_QUEUE_A = "topic.QueueA"; //隊(duì)列名稱(chēng)A private final static String TOPIC_QUEUE_B = "topic.QueueB"; //隊(duì)列名稱(chēng)B private final static String EXCHANGE_NAME = "topicExchange"; //交換器名稱(chēng) @Bean public Queue queueA() { return new Queue(TOPIC_QUEUE_A); } @Bean public Queue queueB() { return new Queue(TOPIC_QUEUE_B); } @Bean public TopicExchange topicExchange() { return new TopicExchange(EXCHANGE_NAME); } /** * * @return */ @Bean public Binding bindingExchangeA() { return BindingBuilder.bind(queueA()).to(topicExchange()).with("topic.QueueA"); } @Bean public Binding bindingExchange() { return BindingBuilder.bind(queueB()).to(topicExchange()).with("topic.#"); } }
消息發(fā)送者
@Component public class TopicMqProduce { @Autowired private RabbitTemplate rabbitTemplate; public void sendMessage(String message,String routeKey) { rabbitTemplate.convertAndSend("topicExchange",routeKey,message); } }
消息接收者
#監(jiān)聽(tīng)A隊(duì)列 @Component @RabbitListener(queues = "topic.QueueA") public class TopicMqConsumerA { private static final Logger logger = LoggerFactory.getLogger(TopicMqConsumerA.class); @RabbitHandler public void receive(String message) { logger.info("receive topic QueueA message content:{}",message); } } #監(jiān)聽(tīng)B隊(duì)列 @Component @RabbitListener(queues = "topic.QueueB") public class TopicMqConsumerB { private static final Logger logger = LoggerFactory.getLogger(TopicMqConsumerB.class); @RabbitHandler public void receive(String message) { logger.info("receive topic QueueB message content:{}",message); } }
測(cè)試代碼
#測(cè)試只發(fā)送A隊(duì)列 @RequestMapping("/sendTopicMessageA") public String sendTopicMessageA() { topicMqProduce.sendMessage("topic.QueueA","this is fanout message"); return "success"; } @RequestMapping("/sendTopicMessageB") public String sendTopicMessageB() { topicMqProduce.sendMessage("topic.QueueB","this is fanout message"); return "success"; }
總結(jié)
到此這篇關(guān)于Java RabbitMQ的三種Exchange模式的文章就介紹到這了,更多相關(guān) Java Exchange模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java實(shí)現(xiàn)讀取txt文件并以在每行以空格取數(shù)據(jù)
今天小編就為大家分享一篇java實(shí)現(xiàn)讀取txt文件并以在每行以空格取數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07java爬蟲(chóng)Gecco工具抓取新聞實(shí)例
本篇文章主要介紹了JAVA 爬蟲(chóng)Gecco工具抓取新聞實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-10-10idea遠(yuǎn)程debug調(diào)試部署在tomcat上項(xiàng)目
本文主要介紹了idea遠(yuǎn)程debug調(diào)試部署在tomcat上項(xiàng)目,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08springboot整合Mybatis-plus的實(shí)現(xiàn)
這篇文章主要介紹了springboot整合Mybatis-plus的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09從零開(kāi)始Mybatis連接數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了Mybatis連接數(shù)據(jù)庫(kù)的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-02-02java開(kāi)發(fā)_圖片截取工具實(shí)現(xiàn)原理
本文將詳細(xì)介紹java開(kāi)發(fā)_圖片截取工具實(shí)現(xiàn)原理,需要了解的朋友可以參考下2012-11-11Java中隊(duì)列Queue和Deque的區(qū)別與代碼實(shí)例
學(xué)過(guò)數(shù)據(jù)結(jié)構(gòu)的,一定對(duì)隊(duì)列不陌生,java也實(shí)現(xiàn)了隊(duì)列,下面這篇文章主要給大家介紹了關(guān)于Java中隊(duì)列Queue和Deque區(qū)別的相關(guān)資料,需要的朋友可以參考下2021-08-08Java實(shí)現(xiàn)ATM銀行管理系統(tǒng)(控制臺(tái)版本)
這篇文章主要為大家詳細(xì)介紹了如何利用Java語(yǔ)言實(shí)現(xiàn)控制臺(tái)版本的ATM銀行管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06