AMQP主题交换路由详细信息

时间:2020-05-27 10:37:52

标签: java rabbitmq amqp rabbitmq-exchange

我最近使用过RabbitMQ和Java API,尤其是在主题交流方面(请参见RabbitMQ教程5(1))。

现在,我真的不太了解交换如何基于密钥与队列完全匹配。 在AMQP 0.9.1(2)文档中,内容为:

主题交换类型的工作方式如下:

  1. 消息队列使用路由模式P绑定到交换机。
  2. 发布者使用路由键R向交换机发送消息。
  3. 如果R匹配P,则消息将传递到消息队列。

用于主题交换的路由密钥必须由零个或多个以点分隔的单词组成。每 该单词可能包含字母A-Z和a-z,以及数字0-9。 路由模式遵循与路由密钥相同的规则,并带有*匹配单个 字,而#则匹配零个或多个字。因此,路由模式* .stock。#与路由键匹配 usd.stock和eur.stock.db,但不包括stock.nasdaq。

基于此,我认为路由键requests.与路由模式requests.* 不匹配,因为*与单词匹配(而对于{ {1}}明确说出零个或更多字)。

RabbitMQ教程1也说

  • (星号)可以完全替代一个单词。

但是当我尝试使用时,使用者收到了带有路由键#的消息。

这是我的消费者:

requests.

以下是处理程序的输出:

private void Subscribe() throws IOException {
    queueName = channel.queueDeclare().getQueue();
    channel.queueBind(queueName, Constants.TOPIC_EXCHANGE, Constants.ROUTING_KEY_ALL_REGIONS);

    channel.basicConsume(queueName, true, this::HandleMessage, s -> {});
}

private void HandleMessage(String tag, Delivery delivery) {
    System.out.println(String.format("received message with routing key '%s'", delivery.getEnvelope().getRoutingKey()));
}

在哪里可以找到具体的文档/语义,“单词”等是什么意思?

谢谢,

迈克尔

0 个答案:

没有答案