【问题标题】:RabbitMQ: Delay exchange not delivered to queueRabbitMQ:延迟交换未传递到队列
【发布时间】:2020-11-21 15:20:46
【问题描述】:

我在 RabbitMQ 中启用了消息延迟插件(插件在 https://github.com/rabbitmq/rabbitmq-delayed-message-exchange 中可用)。在 Exchanged 菜单中创建了延迟消息交换(名为“延迟交换”)。当我尝试通过一段代码向“延迟交换”发送消息时:

rabbitTemplate.convertAndSend("delayed-exchange", queueName, Utils.toJson(obj),
  message -> {
     message.getMessageProperties().setPriority(priorityCode);
     message.getMessageProperties().setDelay(delay);
     message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);
     return message;
  });

我可以在“消息率”图表中看到管理控制台中出现的消息: Exchange message rates

但是没有消息传递到队列: Queue message rates

你有什么想法吗?

【问题讨论】:

    标签: rabbitmq


    【解决方案1】:

    你没有说它是什么库,所以我无法检查,但我敢打赌你误解了 convertAndSend 函数的参数:

    rabbitTemplate.convertAndSend("delayed-exchange", queueName, ...
    

    当您发布到交易所时,您指定一个“路由密钥”,如何解释它取决于交易所。除了名称为空字符串的特殊“默认交换”之外,这不是队列名称。

    路由密钥的工作方式取决于交换类型,在设置交换时delayed-exchange 插件depends on the special x-delayed-type option 的情况下:

    • 如果是“扇出”交换,则忽略路由键,并将消息发布到所有绑定队列
    • 如果是“直接”交换,则路由键直接与绑定键匹配
    • 如果是“主题”交换,则可以将路由键与路由键模式进行匹配
    • 其他类型的交换可用于执行更奇特的路由

    在所有情况下,您都需要在交换器和队列之间创建“绑定”,从您的屏幕截图中我们可以看到您没有这样做:

    您需要选择一个交换类型,创建一个适当的绑定,并使用相关的路由键 - 就像没有延迟交换一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-18
      • 1970-01-01
      • 2020-04-30
      • 1970-01-01
      • 2014-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多