成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

RabbitMQ系列之Topic模型

開源
本文介紹了 RabbitMQ 通信模型中的 Topic 模型的使用,通過交換機和 routing key 實現更靈活的消息路由。

大家好,我是了不起。

RabbitMQ 是一個流行的開源消息隊列軟件,它提供了多種通信模型,例如發布/訂閱模型、路由模型、work模型等。在前面的文章中我們已經介紹了前四種模型,本文將會學習 RabbitMQ 中的 Topic 模型;接下來還會有關于RabbitMQ的系列教程,對你有幫助的話記得關注哦~

Topic 模型

Topic 模型是 RabbitMQ 的高級模型之一,Topic 模型使用了通配符的概念,可以匹配更靈活的路由規則。topic模式相當于是對路由模式的一個升級,topic模式主要就是在匹配的規則上可以實現模糊匹配。

在 Topic 模型中,生產者將消息發送到交換機,交換機根據消息的 routing key 將消息轉發到對應的隊列中。與 Direct 模型不同的是,Topic 模型中 routing key 支持通配符匹配,其中 '*' 可以匹配一個單詞,'#' 可以匹配多個單詞。例如,"order.*" 可以匹配 "order.create","order.delete" 等消息,而 "order.#" 可以匹配 "order.create.one","order.delete.two" 等消息。

適用場景

Topic 模型適用于需要靈活的消息路由規則的場景,例如:

  1. 新聞網站訂閱分類消息;
  2. 電商網站訂閱商品分類消息;
  3. 金融機構訂閱股票市場消息等。

演示

  1. 生產者
// 生產者
public class Producer {
private static final String EXCHANGE_NAME = "exchange_topic_1";
private static final String EXCHANGE_ROUTING_KEY1 = "topic.km";
private static final String EXCHANGE_ROUTING_KEY2 = "topic.km.001";

public static void main(String[] args) throws IOException, TimeoutException {
Connection connection = ConnectionUtils.getConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare(EXCHANGE_NAME, "topic");
for (int i = 0; i < 100; i++) {
// topic在路由模型的基礎上,只有路由的key發生改變,其余的都不變
if (i % 2 == 0) {
channel.basicPublish(EXCHANGE_NAME, EXCHANGE_ROUTING_KEY1, MessageProperties.PERSISTENT_TEXT_PLAIN, ("topic模型發送的第 " + i + " 條信息").getBytes());
} else {
channel.basicPublish(EXCHANGE_NAME, EXCHANGE_ROUTING_KEY2, MessageProperties.PERSISTENT_TEXT_PLAIN, ("topic模型發送的第 " + i + " 條信息").getBytes());
}
}
channel.close();
connection.close();
}
}
  1. 消費者
// 消費者1
public class Consumer1 {
private static final String QUEUE_NAME = "queue_topic_1";
private static final String EXCHANGE_NAME = "exchange_topic_1";
private static final String EXCHANGE_ROUTING_KEY = "topic.*";

public static void main(String[] args) throws IOException, TimeoutException {
Connection connection = ConnectionUtils.getConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
channel.exchangeDeclare(EXCHANGE_NAME, "topic");
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, EXCHANGE_ROUTING_KEY);
DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("消費者1接收到的消息是:" + new String(body));
}
};
channel.basicConsume(QUEUE_NAME, true, defaultConsumer);
}
}
// 消費者2
public class Consumer2 {
private static final String QUEUE_NAME = "queue_topic_2";
private static final String EXCHANGE_NAME = "exchange_topic_1";
private static final String EXCHANGE_ROUTING_KEY = "topic.#";

public static void main(String[] args) throws IOException, TimeoutException {
Connection connection = ConnectionUtils.getConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
channel.exchangeDeclare(EXCHANGE_NAME, "topic");
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, EXCHANGE_ROUTING_KEY);
DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("消費者2接收到的消息是:" + new String(body));
}
};
channel.basicConsume(QUEUE_NAME, true, defaultConsumer);
}
}

測試

先啟動2個消費者,再啟動生產者

消費者1訂閱的是 "order.*" 的消息,消費者2訂閱的是 "order.#" 的消息,可以得到以下結果:

消費者1接收到的消息是:"Topic 模型發送的偶數條消息"

消費者2接收到的消息是:"Topic 模型發送的全部消息"

小結

本文介紹了 RabbitMQ 通信模型中的 Topic 模型的使用,通過交換機和 routing key 實現更靈活的消息路由。在實際使用過程中,需要注意以下幾點:

  1. 路由鍵的格式應該是多個單詞組成,用 '.' 分隔;
  2. '#' 匹配多個單詞,'*' 匹配一個單詞;
  3. 一個隊列可以綁定多個 routing key;
  4. 如果交換機沒有匹配到任何一個隊列,則會拋棄該消息。
責任編輯:武曉燕 來源: Java技術指北
相關推薦

2023-01-06 08:18:44

2023-01-09 08:21:15

通信模型work

2023-01-11 08:22:22

RabbitMQ通信模型

2024-05-06 07:58:23

MoE模型系統

2025-02-17 08:00:00

DeepSeek模型AI

2025-02-13 11:00:30

2023-03-01 08:23:11

通信模型RabbitMQ

2016-09-23 10:20:22

JUnit擴展模型Extension

2022-03-29 08:31:18

RabbitMQMQ客戶端

2022-04-01 08:31:11

RabbitMQ客戶端Channel

2022-04-07 08:30:57

AMQP協議RabbitMQ客戶端源碼

2024-02-05 14:12:37

大模型RAG架構

2022-04-20 08:32:09

RabbitMQ流控制

2011-04-29 10:58:11

SimpleFrame

2020-11-06 09:01:46

迭代器模式

2024-06-17 07:46:01

2021-07-07 21:40:46

Rust函數勸退

2023-11-27 07:44:59

RabbitMQ機制

2023-11-19 23:36:50

2025-03-06 07:28:31

DeepSeek大模型人工智能
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲国产免费 | 欧美成人精品在线 | 精品乱码一区二区 | 狠狠插狠狠操 | 久久精品中文字幕 | 69亚洲精品 | 精品免费国产视频 | 欧美日韩国产高清 | 日本色综合 | 国产午夜视频 | 91福利电影在线观看 | 亚洲免费毛片 | 亚洲高清成人在线 | 日日干日日操 | 热久久999 | 欧美极品少妇xxxxⅹ免费视频 | 欧美精品在线一区二区三区 | 国产精品高清一区二区三区 | 国产欧美日韩在线 | 亚洲一区二区三区视频 | 免费在线黄色av | 成年人在线视频 | 91精品国产一区二区三区 | 精品日韩一区 | 国产精品自拍一区 | 午夜视频网站 | 亚洲第一在线视频 | 日韩精品在线播放 | 成人午夜免费视频 | 久久中文字幕视频 | 日韩成人一区 | 亚洲香蕉 | 日韩一二区在线观看 | 99re视频在线 | 久久精品欧美一区二区三区不卡 | 麻豆精品一区二区三区在线观看 | 国产精品一区二区三区久久 | 欧美日韩黄色一级片 | 黄色高清视频 | 国产精品久久久久久久久久久久冷 | 蜜桃精品噜噜噜成人av |