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模式
- Python3 - 用Shell萬用字元匹配字串Python字元字串
- 每日一學:如何在RabbitMQ中搭建Topics萬用字元模式MQ字元模式
- RabbitMQ-初見MQ
- 萬用字元詳解字元
- dataframe 萬用字元篩選字元
- LeetCode 44 萬用字元匹配LeetCode字元
- 命令列萬用字元教程命令列字元
- Ubuntu萬用字元的使用Ubuntu字元
- RabbitMQ-簡單佇列MQ佇列
- 萬用字元與特殊符號字元符號
- shell命令中的萬用字元字元
- SQL語法之SQL 萬用字元SQL字元
- Java 泛型中的萬用字元Java泛型字元
- 萬用字元 and [] 中括號的用法字元
- OpenJudge 帶萬用字元的字串匹配字元字串匹配
- 泛型無界萬用字元<?>的思考泛型字元
- 微服務的Zuul萬用字元規則微服務Zuul字元
- 《MySQL必知必會》萬用字元 ( like , % , _ ,)MySql字元
- 免費申請萬用字元證書字元
- corejava基礎知識(4)-萬用字元Java字元
- CSS * 星號 萬用字元選擇器CSS字元
- SQLite中的SELECT子句使用萬用字元SQLite字元
- 使用萬用字元證書可有什麼限制字元
- 怎麼選擇萬用字元SSL證書?字元
- 一文了解萬用字元SSL證書字元
- java方法引數中萬用字元的使用Java字元
- 萬用字元證書有什麼好處?字元
- Linux 萬用字元可能產生的問題Linux字元
- 萬用字元SSL證書暢銷的原因字元
- 如何選購最佳萬用字元SSL證書?字元
- 如何理解掩碼、反掩碼、萬用字元字元
- 萬用字元——*可以當空串或任意串(一)字元
- Java™ 教程(泛型萬用字元使用指南)Java泛型字元
- 利用萬用字元進行Linux本地提權字元Linux
- 推薦|免費ssl萬用字元證書https萬用字元證書平臺,價效比超高的證書字元HTTP
- 【訊息佇列】RabbitMq-交換機模型佇列MQ模型