RabbitMQ-萬用字元模式
一、簡介
上一篇,我們說到《RabbitMQ-路由模式》實現了一條訊息被多個消費者消費。在路由模式中我們通過指定routingKey,消費者只有訂閱了該key的佇列才能消費訊息。今天我們學習萬用字元模式,它可以說是路由模式的升級版,反過來說路由模式就是萬用字元模式的特殊情況。
萬用字元模式:將路由鍵和某模式進行匹配,此時佇列需要繫結一個模式上。符號“#”匹配一個或多個詞,符號“*”匹配一個詞。比如“hello.#”能夠匹配到“hello.123.456”,但是“hello.*”只能匹配到“hello.123”。
二、 編碼實現
2.1、生產者
public class Producer {
public static void main(String[] argv) throws Exception {
// 獲取到連線以及mq通道
Connection connection = ConnectionUtil.getConnection();
Channel channel = connection.createChannel();
// 宣告exchange
channel.exchangeDeclare(QueueUtil.EXCHANGE_NAME_TOPIC, "topic");
// 訊息內容
String message = "Hello World!";
channel.basicPublish(QueueUtil.EXCHANGE_NAME_TOPIC, "hello.123.456", null, message.getBytes());
channel.close();
connection.close();
}
}
2.2、消費者1
public class Receiver1 {
public static void main(String[] argv) throws Exception {
// 獲取到連線以及mq通道
Connection connection = ConnectionUtil.getConnection();
Channel channel = connection.createChannel();
// 宣告佇列
channel.queueDeclare(QueueUtil.QUEUE_NAME_TOPIC1, false, false, false, null);
// 繫結佇列到交換機
channel.queueBind(QueueUtil.QUEUE_NAME_TOPIC1, QueueUtil.EXCHANGE_NAME_TOPIC, "hello.*");
// 同一時刻伺服器只會發一條訊息給消費者
channel.basicQos(1);
// 定義佇列的消費者
QueueingConsumer consumer = new QueueingConsumer(channel);
// 監聽佇列,手動返回完成
channel.basicConsume(QueueUtil.QUEUE_NAME_TOPIC1, false, consumer);
// 獲取訊息
while (true) {
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
String message = new String(delivery.getBody());
System.out.println("Receiver1 Received:" + message);
Thread.sleep(10);
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
}
}
}
2.3、消費者2
public class Receiver2 {
public static void main(String[] argv) throws Exception {
// 獲取到連線以及mq通道
Connection connection = ConnectionUtil.getConnection();
Channel channel = connection.createChannel();
// 宣告佇列
channel.queueDeclare(QueueUtil.QUEUE_NAME_TOPIC2, false, false, false, null);
// 繫結佇列到交換機
channel.queueBind(QueueUtil.QUEUE_NAME_TOPIC2, QueueUtil.EXCHANGE_NAME_TOPIC, "hello.#");
// 同一時刻伺服器只會發一條訊息給消費者
channel.basicQos(1);
// 定義佇列的消費者
QueueingConsumer consumer = new QueueingConsumer(channel);
// 監聽佇列,手動返回完成
channel.basicConsume(QueueUtil.QUEUE_NAME_TOPIC2, false, consumer);
// 獲取訊息
while (true) {
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
String message = new String(delivery.getBody());
System.out.println("Receiver2 Received:" + message);
Thread.sleep(10);
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
}
}
}
三、測試
(1)通過管理介面可以看到topic_exchange有兩個佇列。
(2)生產者傳送一條hello.123.456的訊息,只有消費者2消費。
(3)生產者傳送一條hello.123的訊息,消費者1和消費者2都能消費。
相關文章
- RabbitMQ-路由模式MQ路由模式
- RabbitMQ-訂閱模式MQ模式
- RabbitMQ-初見MQ
- 每日一學:如何在RabbitMQ中搭建Topics萬用字元模式MQ字元模式
- Python3 - 用Shell萬用字元匹配字串Python字元字串
- [MYSQL-8]用萬用字元進行過濾MySql字元
- 萬用字元詳解字元
- Linux萬用字元Linux字元
- Linux 萬用字元Linux字元
- RabbitMQ-簡單佇列MQ佇列
- Ubuntu萬用字元的使用Ubuntu字元
- 命令列萬用字元教程命令列字元
- dataframe 萬用字元篩選字元
- 泛型概述-萬用字元泛型字元
- SQL Like萬用字元使用SQL字元
- java的classpath萬用字元Java字元
- Linux萬用字元(轉)Linux字元
- Linux Shell 萬用字元、元字元、轉義符使用Linux字元
- 萬用字元與特殊符號字元符號
- shell命令中的萬用字元字元
- Struts(三) 萬用字元講解字元
- jQuery *萬用字元選擇器jQuery字元
- 帶萬用字元的LIKE子句字元
- leetcode之萬用字元LeetCode字元
- 萬用字元 and [] 中括號的用法字元
- OpenJudge 帶萬用字元的字串匹配字元字串匹配
- LeetCode 44 萬用字元匹配LeetCode字元
- Java 泛型中的萬用字元Java泛型字元
- SpringMvc Ant萬用字元的使用SpringMVC字元
- linux管道符和萬用字元Linux字元
- 使用萬用字元增強泛型字元泛型
- 談談方括號萬用字元字元
- DELPHI的萬用字元比較 (轉)字元
- SQL語法之SQL 萬用字元SQL字元
- 微服務的Zuul萬用字元規則微服務Zuul字元
- 《MySQL必知必會》萬用字元 ( like , % , _ ,)MySql字元
- corejava基礎知識(4)-萬用字元Java字元
- 免費申請萬用字元證書字元