Java Spring boot 整合RabbitMQ(五):主題(Topics)-B2B2C小程式電子商務
在我們的日誌系統中,我們不只希望訂閱基於嚴重程度的日誌,同時還希望訂閱基於傳送來源的日誌。Unix 工具 syslog 就是同時基於嚴重程度 -severity (info/warn/crit…) 和 裝置 -facility (auth/cron/kern…) 來路由日誌的。
如果這樣的話,將會給予我們非常大的靈活性,我們既可以監聽來源於”cron” 的嚴重程度為”critical errors” 的日誌,也可以監聽來源於”kern” 的所有日誌。
為了實現這個目的,接下來我們學習如何使用另一種更復雜的交換器 ——topic exchange。
Topic exchange
topic exchange 與 direct exchange 類似,也是將訊息路由到 binding key 與 routing key 相匹配的 Queue 中,但這裡的匹配規則有些不同,它約定:
routing key 為一個句點號. 分隔的字串(我們將被句點號. 分隔開的每一段獨立的字串稱為一個單詞),如 “stock.usd.nyse”、”nyse.vmw”、”quick.orange.rabbit”
binding key 與 routing key 一樣也是句點號. 分隔的字串
binding key 中可以存在兩種特殊字元 * 與#,用於做模糊匹配,其中 * 用於匹配一個單詞,#用於匹配多個單詞(可以是零個)
這個例子裡,我們傳送的所有訊息都是用來描述小動物的。傳送的訊息所攜帶的路由鍵是由三個單詞所組成的,這三個單詞被兩個。分割開。路由鍵裡的第一個單詞描述的是動物的速度,第二個單詞是動物的顏色,第三個是動物的種類。所以它看起來是這樣的:” 速度。顏色。種類”。
我們建立了三個繫結:Q1 的 binding key 為”.orange.“,Q2 的 binding key 為”…rabbit” 和”lazy.#”。
這三個 binding key 被可以總結為:
Q1 對所有的桔黃色動物都感興趣。
Q2 則是對所有的兔子和所有懶惰的動物感興趣。
以上圖中的配置為例:
routingKey=”quick.orange.rabbit” 的訊息會同時路由到 Q1 與 Q2
routingKey=”lazy.orange.fox” 的訊息會路由到 Q1 與 Q2
routingKey=”lazy.brown.fox” 的訊息會路由到 Q2
routingKey=”lazy.pink.rabbit” 的訊息會路由到 Q2(只會投遞給 Q2 一次,雖然這個 routingKey 與 Q2 的兩個 bindingKey 都匹配)
routingKey=”quick.brown.fox”、routingKey=”orange”、routingKey=”quick.orange.male.rabbit” 的訊息將會被丟棄,因為它們沒有匹配任何 bindingKey
如果我們違反約定,傳送了一個 routing key 為一個單詞或者四個單詞(”orange” or “quick.orange.male.rabbit”)的訊息時,該訊息不會投遞給任何一個佇列,而且會丟失掉。
瞭解springcloud架構可以加求求:三五三六二四七二五九
但是,即使”lazy.orange.male.rabbit” 有四個單詞,他還是會匹配最後一個繫結,並且被投遞到第二個佇列中。
topic exchange
topic exchange 是強大的,它可以表現出跟其他 exchange 類似的行為。
當一個佇列的 binding key 為 “#”(井號) 的時候,它會接收所有訊息,而不考慮 routing key,就像 fanout exchange。
當 * (星號) 和 # (井號) 這兩個特殊字元都未在繫結鍵中出現的時候,此時 topic exchange 會表現得像 direct exchange 一樣。
程式碼整合
生產者
public class Tut5Sender { @Autowird private AmqpTemplate template; @Autowird private TopicExchange topic; private int index; private int count; private final String[] keys = {"quick.orange.rabbit", "lazy.orange.elephant", "quick.orange.fox", "lazy.brown.fox", "lazy.pink.rabbit", "quick.brown.fox"}; @Scheduled(fixedDelay = 1000, initialDelay = 500) public void send() { StringBuilder builder = new StringBuilder("Hello to "); if (++this.index == keys.length) { this.index = 0; } String key = keys[this.index]; builder.append(key).append(' '); builder.append(Integer.toString(++this.count)); String message = builder.toString(); template.convertAndSend(topic.getName(), key, message); System.out.println(" [x] Sent '" + message + "'"); } }
消費者
public class Tut5Receiver { @RabbitListener(queues = "#{autoDeleteQueue1}") public void receiver1(String in) throws InterruptedException { receive(in, 1); } @RabbitListener(queues = "#{autoDeleteQueue2}") public void receiver2(String in) throws InterruptedException { receive(in, 2); } private void receive(String in, int instance) throws InterruptedException { StopWatch watch = new StopWatch(); watch.start(); System.out.println("instance " + instance + " [x] Received '" + in + "'"); doWork(in); watch.stop(); System.out.println("instance " + instance + " [x] Done in " + watch.getTotalTimeSeconds() + "s"); } private void doWork(String in) throws InterruptedException { for (char c : in.toCharArray()) { if (c == '.') { Thread.sleep(1000); } } } }
配置類
@Profile({"tut5", "topics"}) @Configuration public class Tut5Config { @Bean public TopicExchange topic() { return new TopicExchange("tut.topic"); } @Profile("receiver") private static class ReceiverConfig { @Bean public Queue autoDeleteQueue1() { return new AnonymousQueue(); } @Bean public Queue autoDeleteQueue2() { return new AnonymousQueue(); } @Bean public Binding binding1a(TopicExchange topic, Queue autoDeleteQueue1) { return BindingBuilder.bind(autoDeleteQueue1) .to(topic) .with("*.orange.*"); } @Bean public Binding binding2a(TopicExchange topic, Queue autoDeleteQueue2) { return BindingBuilder.bind(autoDeleteQueue2) .to(topic) .with("*.*.rabbit"); } @Bean public Binding binding2b(TopicExchange topic, Queue autoDeleteQueue2) { return BindingBuilder.bind(autoDeleteQueue2) .to(topic) .with("lazy.#"); } @Bean public Tut5Receiver receiver() { return new Tut5Receiver(); } } @Profile("sender") @Bean public Tut5Sender sender() { return new Tut5Sender(); } }
執行
maven 編譯
mvn clean package -Dmaven.test.skip=true
執行
java -jar target/rabbitmq-tutorial-0.0.1-SNAPSHOT.jar --spring.profiles.active=tut5,receiver --tutorial.client.duration=60000
java -jar target/rabbitmq-tutorial-0.0.1-SNAPSHOT.jar --spring.profiles.active=tut5,sender --tutorial.client.duration=60000
輸出
// Sender
Ready … running for 60000ms
[x] Sent ‘Hello to lazy.orange.elephant 1’
[x] Sent ‘Hello to quick.orange.fox 2’
[x] Sent ‘Hello to lazy.brown.fox 3’
[x] Sent ‘Hello to lazy.pink.rabbit 4’
[x] Sent ‘Hello to quick.brown.fox 5’
[x] Sent ‘Hello to quick.orange.rabbit 6’
[x] Sent ‘Hello to lazy.orange.elephant 7’
[x] Sent ‘Hello to quick.orange.fox 8’
[x] Sent ‘Hello to lazy.brown.fox 9’
[x] Sent ‘Hello to lazy.pink.rabbit 10’
// Receiver
Ready … running for 60000ms
instance 1 [x] Received ‘Hello to lazy.orange.elephant 1’
instance 2 [x] Received ‘Hello to lazy.orange.elephant 1’
instance 2 [x] Done in 2.004s
instance 1 [x] Done in 2.004s
instance 2 [x] Received ‘Hello to lazy.brown.fox 3’
instance 1 [x] Received ‘Hello to quick.orange.fox 2’
instance 1 [x] Done in 2.006s
instance 2 [x] Done in 2.006s
instance 2 [x] Received ‘Hello to lazy.pink.rabbit 4’
instance 1 [x] Received ‘Hello to quick.orange.rabbit 6’
instance 2 [x] Done in 2.006s
instance 2 [x] Received ‘Hello to quick.orange.rabbit 6’
instance 1 [x] Done in 2.007s
instance 1 [x] Received ‘Hello to lazy.orange.elephant 7’
instance 2 [x] Done in 2.006s
instance 2 [x] Received ‘Hello to lazy.orange.elephant 7’
instance 1 [x] Done in 2.003s
instance 1 [x] Received ‘Hello to quick.orange.fox 8’
instance 2 [x] Done in 2.005s
instance 2 [x] Received ‘Hello to lazy.brown.fox 9’
instance 1 [x] Done in 2.005s
instance 2 [x] Done in 2.004s
instance 2 [x] Received ‘Hello to lazy.pink.rabbit 10’
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69952307/viewspace-2678810/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java Spring Boot 整合RabbitMQ(一):Hello World -B2B2C小程式電子商務JavaSpring BootMQ
- Java Spring boot 整合RabbitMQ(三):(Publish/Subscribe)-B2B2C小程式電子商務JavaSpring BootMQ
- Java Spring boot 整合RabbitMQ(二):工作佇列(Work queues)-B2B2C小程式電子商務JavaSpring BootMQ佇列
- Java Springboot整合RabbitMQ(六):(RPC)-b2b2c小程式電子商務JavaSpring BootMQRPC
- Java Springboot 整合RabbitMQ(四):路由(Routing)-B2B2C小程式電子商務JavaSpring BootMQ路由
- JAVA spring cloud boot b2b2c電子商務分散式微服務JavaSpringCloudboot分散式微服務
- java Spring Cloud b2b2c o2o 電子商務 Eureka【Finchley 版】-b2b2c小程式電子商務JavaSpringCloud
- java版 spring cloud spring boot mybatis實現 b2b2c 多商戶電子商務平臺JavaCloudSpring BootMyBatis
- SpringCloud分散式微服務b2b2c電子商務(十三)Springboot整合RabbitMQGCCloud分散式微服務Spring BootMQ
- Spring Boot整合rabbitmqSpring BootMQ
- Spring Boot 整合 rabbitmqSpring BootMQ
- JAVA商城 B2B2C商城系統 小程式 電子商務 springcloud商城JavaSpringGCCloud
- SpringCloud分散式微服務b2b2c電子商務(五)springboot整合 beatlsqlGCCloud分散式微服務Spring BootTLSSQL
- spring cloud spring boot 構建java版 分散式微服務 b2b2c o2o電子商務雲商平臺CloudSpring BootJava分散式微服務
- spring cloud構建java版 b2b2c電子商務雲商平臺SpringCloudJava
- SpringCloud分散式微服務b2b2c電子商務-Spring Boot配置檔案詳解GCCloud分散式微服務Spring Boot
- (十四)JAVA springboot微服務b2b2c電子商務系統- Spring Cloud構建分散式電子商務平臺JavaSpring Boot微服務Cloud分散式
- spring boot-整合RabbitMq(RabbitMq基礎)Spring BootMQ
- Spring Boot 整合 RabbitMQ 訊息事務(消費者)Spring BootMQ
- 電子商務Java微服務 SpringBoot整合SpringSecurityJava微服務Spring BootGse
- JAVA b2b2c電子商務SpringCloud分散式微服務spring-security-基本JavaSpringGCCloud分散式微服務
- java B2B2C原始碼電子商務平臺---大話Spring CloudJava原始碼SpringCloud
- spring cloud+spring boot 電子商務-spring boot 引用方式${}和@@用法與區別CloudSpring Boot
- java B2B2C原始碼電子商務平臺Java原始碼
- RabbitMQ(三):RabbitMQ與Spring Boot簡單整合MQSpring Boot
- 備忘錄五:Spring Boot + RabbitMQ 分散式事務Spring BootMQ分散式
- spring cloud+spring boot 電子商務spring boot獲取配置檔案的屬性CloudSpring Boot
- java B2B2C 仿淘寶電子商城系統-Spring Cloud構建分散式電子商務平臺JavaSpringCloud分散式
- spring-boot-route(十三)整合RabbitMQSpringbootMQ
- Next.js+Spring boot開源電子商務專案JSSpring Boot
- java B2B2C電子商務平臺分析之七-Spring Cloud ConfigJavaSpringCloud
- java B2B2C springmvc mybatis電子商務平臺原始碼-Spring Cloud SecurityJavaSpringMVCMyBatis原始碼Cloud
- Springcloud分散式微服務b2b2c電子商務一整合Hystrix(二)SpringGCCloud分散式微服務
- java b2b2c電子商務 springcloud分散式微服務-Session共享JavaSpringGCCloud分散式微服務Session
- java B2B2C電子商務平臺------服務閘道器zuulJavaZuul
- java B2B2C Springcloud電子商務平臺原始碼JavaSpringGCCloud原始碼
- 電子商務平臺 java b2b2c o2oJava
- Springcloud分散式微服務b2b2c電子商務一Spring Cloud常見問題(一)SpringGCCloud分散式微服務