在哪里可以找到做網(wǎng)站的公司濟(jì)南網(wǎng)站制作平臺
文章目錄
- 發(fā)布訂閱
- Fanout 交換機(jī)
- Direct 交換機(jī)
- Topic 交換機(jī)
- 通配符規(guī)則
發(fā)布訂閱
在這里插入圖片描述
Fanout 交換機(jī)
Fanout 交換機(jī)會將收到的消息路由到每一個跟其綁定的queue上。
我們做一個交換機(jī),兩個隊列,兩個消費(fèi)者分別連接兩個隊列。
定義交換機(jī),隊列,交換機(jī)與隊列之間的連接:
/*** fanout交換機(jī)配置*/
@Configuration
public class FanoutConfig {/*** 聲明交換機(jī),設(shè)置名稱* @return*/@Beanpublic FanoutExchange fanoutExchange() {return new FanoutExchange("lpy.fanout");}/*** 隊列1* @return*/@Beanpublic Queue fanoutQueue1() {return new Queue("fanout.queue1");}/*** 綁定交換機(jī)和隊列1*/@Beanpublic Binding bindingQueue1(Queue fanoutQueue1, FanoutExchange fanoutExchange) {return BindingBuilder.bind(fanoutQueue1).to(fanoutExchange);}/*** 隊列1* @return*/@Beanpublic Queue fanoutQueue2() {return new Queue("fanout.queue2");}/*** 綁定交換機(jī)和隊列2*/@Beanpublic Binding bindingQueue2(Queue fanoutQueue2, FanoutExchange fanoutExchange) {return BindingBuilder.bind(fanoutQueue2).to(fanoutExchange);}}
定義監(jiān)聽接口:
@RabbitListener(queues = "fanout.queue1")public void listenFanoutQueue1(String msg) {System.out.println("消費(fèi)者1接收到Fanout消息:" + msg);}@RabbitListener(queues = "fanout.queue2")public void listenFanoutQueue2(String msg) {System.out.println("消費(fèi)者2接收到Fanout消息:" + msg);}
發(fā)送消息:
@Testpublic void testFanoutExchange() {// 隊列名稱String exchangeName = "lpy.fanout";// 消息String message = "hello fanout!";rabbitTemplate.convertAndSend(exchangeName, "", message);}
啟動,運(yùn)行:
可以看到,我們發(fā)的一個消息,被兩個消費(fèi)者消費(fèi)了,說明實現(xiàn)成功,交換機(jī)把消息路由到了每個隊列。
Direct 交換機(jī)
不同的消息路由到不同的隊列,根據(jù)key路由建。
下面來實現(xiàn)一下,基于注解來聲明隊列和交換機(jī),這樣比較方便,直接定義再接口上。
@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "direct.queue1"),exchange = @Exchange(name = "lpy.direct", type = ExchangeTypes.DIRECT),key = {"red", "blue"}))public void listenDirectQueue1(String msg){System.out.println("消費(fèi)者1接收到direct.queue1的消息:" + msg);}@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "direct.queue2"),exchange = @Exchange(name = "lpy.direct", type = ExchangeTypes.DIRECT),key = {"red", "yellow"}))public void listenDirectQueue2(String msg){System.out.println("消費(fèi)者2接收到direct.queue2的消息:" + msg);}
啟動測試:
- key 為 red
@Testpublic void testSendDirectExchange() {// 交換機(jī)名稱String exchangeName = "lpy.direct";// 消息String message = "hello direct red";// 發(fā)送消息rabbitTemplate.convertAndSend(exchangeName, "red", message);// 消息String message2 = "hello direct blue";// 發(fā)送消息rabbitTemplate.convertAndSend(exchangeName, "blue", message2);// 消息String message3 = "hello direct yellow";// 發(fā)送消息rabbitTemplate.convertAndSend(exchangeName, "yellow", message3);}
可以看到,根據(jù)key來進(jìn)行了路由。
Topic 交換機(jī)
Topic 交換機(jī)與Direct相似,只不過使用了key可以使用通配符。
RoutingKey一般由一個或多個單詞組成,用“.”分割。
通配符規(guī)則
# 匹配一個或多個詞
* 匹配一個詞
例如:
舉例:
a.# 可以匹配a.b.c、a.b等a.* 只可以匹配a.b
現(xiàn)在來實驗一下吧:
和Direct同樣的寫法,只是key改為通配符的:
@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "topic.queue1"),exchange = @Exchange(name = "lpy.topic", type = ExchangeTypes.TOPIC),key = "a.*"))public void listenTopicQueue1(String msg){System.out.println("消費(fèi)者接收到topic.queue1的消息:" + msg);}@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "topic.queue2"),exchange = @Exchange(name = "lpy.topic", type = ExchangeTypes.TOPIC),key = "a.#"))public void listenTopicQueue2(String msg){System.out.println("消費(fèi)者接收到topic.queue2的消息:" + msg);}
發(fā)送消息:
@Testpublic void testSendTopicExchange() {// 交換機(jī)名稱String exchangeName = "lpy.topic";// 消息String message = "hello topic a.b";// 發(fā)送消息rabbitTemplate.convertAndSend(exchangeName, "a.b", message);// 消息String message1 = "hello topic a.b.c";// 發(fā)送消息rabbitTemplate.convertAndSend(exchangeName, "a.b.c", message1);}
運(yùn)行結(jié)果:
可以看到#確實可以匹配多個單詞,而*只能匹配一個。