RabbitMQ:延迟交换未传递到队列

RabbitMQ:延迟交换未传递到队列,rabbitmq,Rabbitmq,我在RabbitMQ中启用了消息延迟插件(插件在中可用)。延迟消息交换(名为“延迟交换”)是在交换菜单中创建的。当我试图通过一段代码向“延迟交换”发送消息时: rabbitTemplate.convertAndSend("delayed-exchange", queueName, Utils.toJson(obj), message -> { message.getMessageProperties().setPriority(priorityCode);

我在RabbitMQ中启用了消息延迟插件(插件在中可用)。延迟消息交换(名为“延迟交换”)是在交换菜单中创建的。当我试图通过一段代码向“延迟交换”发送消息时:

rabbitTemplate.convertAndSend("delayed-exchange", queueName, Utils.toJson(obj),
  message -> {
     message.getMessageProperties().setPriority(priorityCode);
     message.getMessageProperties().setDelay(delay);
     message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);
     return message;
  });
我可以在管理控制台的“消息速率”图表中看到消息:

但没有消息传递到队列:


有什么想法吗?

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

rabbitTemplate.convertAndSend("delayed-exchange", queueName, ...
在发布到exchange时,您可以指定“路由密钥”,如何解释该密钥取决于exchange。除了名称为空字符串的特殊“默认交换”之外,这不是队列名称

路由键的工作方式取决于交换类型,在设置交换时使用
延迟交换
插件的情况下:

  • 如果是“扇出”交换,则忽略路由密钥,并将消息发布到所有绑定队列
  • 如果是“直接”交换,则路由密钥直接与绑定密钥匹配
  • 如果是“主题”交换,则可以根据路由密钥的模式匹配路由密钥
  • 其他类型的交换可用于执行更奇特的路由
在所有情况下,您都需要在exchange和队列之间创建一个“绑定”,从您的屏幕截图中我们可以看出您没有这样做:

您需要选择一个交换类型,创建一个适当的绑定,并使用相关的路由密钥——就像在没有延迟交换的情况下一样