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-07
idea遠程debug調(diào)試部署在tomcat上項目
本文主要介紹了idea遠程debug調(diào)試部署在tomcat上項目,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08
springboot整合Mybatis-plus的實現(xiàn)
這篇文章主要介紹了springboot整合Mybatis-plus的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Java中隊列Queue和Deque的區(qū)別與代碼實例
學(xué)過數(shù)據(jù)結(jié)構(gòu)的,一定對隊列不陌生,java也實現(xiàn)了隊列,下面這篇文章主要給大家介紹了關(guān)于Java中隊列Queue和Deque區(qū)別的相關(guān)資料,需要的朋友可以參考下2021-08-08
Java實現(xiàn)ATM銀行管理系統(tǒng)(控制臺版本)
這篇文章主要為大家詳細(xì)介紹了如何利用Java語言實現(xiàn)控制臺版本的ATM銀行管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-06-06

