Java RabbitMQ的三種Exchange模式
前言:
上一章講解RabbitMq的相關(guān)知識和如何使用Spring Boot集成Rabbitmq發(fā)送消息,本文將講解RabbitMQ三種Exchange模式。
簡介
RabbitMQ的Exchange通常有三種模式分別為:Direct模式、Fanout模式、Topic模式。
Direct模式
Rabbit的Direct Exchange模式是指消息發(fā)送導(dǎo)RouteKey中指定的Queue,Direct模式可以使用Rabbit自帶的Exchange,所以不需要將Exchange進行任何綁定。消息傳遞時,RouteKey必須完全匹配,消息才會被隊列接收,否則消息將會被拋棄。
原理如下圖:
示例代碼:
可以參考上一章的示例代碼,本文就不在重復(fù)闡述。
Fanout Exchange
Fanout Exchange 模式不處理路由鍵,只需要簡單的將隊列綁定到交換機上發(fā)送到交換機的消息都會被轉(zhuǎn)發(fā)到與該交換機綁定的所有隊列上。因此Fanout交換機轉(zhuǎn)發(fā)消息是最快的。
原理如下圖:
示例代碼
配置類
@Configuration public class RabbmitFanoutConfig { private final static String FANOUT_QUEUE_1 = "fanoutQueue1"; //隊列名稱1 private final static String EXCHANGE_NAME = "fanoutExchange"; //交換器名稱 @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); } }
說明:convertAndSend 第一個參數(shù)為Exchange的名稱,第二參數(shù)為routekey的名稱,由于Fanout不需要通過Routekey來綁定所以參數(shù)為空。
消費者
@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); } }
說明:監(jiān)聽隊列的名稱與配置的隊列名稱一致。
測試代碼
@RequestMapping("/sendFanOutMessage") public String sendFanOutMessage() { fanOutMqProduce.sendMessage("this is fanout message"); return "success"; }
運行結(jié)果:
c.s.f.r.consumer.FanOutMqConsumer - receive message content:this is fanout message
Topic模式
Topic模式是通過Routing Key來進行通配符匹配。
- 符號#代表可以匹配一個或多個詞
- 符號*代表只能匹配一個詞
原理如下圖:
說明:例如:usa.#能夠匹配導(dǎo)usa.news.huofu,而europe.*只能匹配europe.news或者europe.weather
示例代碼
配置類
@Configuration public class RabbmitTopicConfig { private final static String TOPIC_QUEUE_A = "topic.QueueA"; //隊列名稱A private final static String TOPIC_QUEUE_B = "topic.QueueB"; //隊列名稱B private final static String EXCHANGE_NAME = "topicExchange"; //交換器名稱 @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)聽A隊列 @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)聽B隊列 @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); } }
測試代碼
#測試只發(fā)送A隊列 @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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java實現(xiàn)讀取txt文件并以在每行以空格取數(shù)據(jù)
今天小編就為大家分享一篇java實現(xiàn)讀取txt文件并以在每行以空格取數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07idea遠程debug調(diào)試部署在tomcat上項目
本文主要介紹了idea遠程debug調(diào)試部署在tomcat上項目,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08springboot整合Mybatis-plus的實現(xiàn)
這篇文章主要介紹了springboot整合Mybatis-plus的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2020-09-09Java中隊列Queue和Deque的區(qū)別與代碼實例
學(xué)過數(shù)據(jù)結(jié)構(gòu)的,一定對隊列不陌生,java也實現(xiàn)了隊列,下面這篇文章主要給大家介紹了關(guān)于Java中隊列Queue和Deque區(qū)別的相關(guān)資料,需要的朋友可以參考下2021-08-08Java實現(xiàn)ATM銀行管理系統(tǒng)(控制臺版本)
這篇文章主要為大家詳細介紹了如何利用Java語言實現(xiàn)控制臺版本的ATM銀行管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-06-06