使用RabbitMQ Web UI,当我发布到没有当前队列绑定的主题交换时,rabbitmq表示该消息已发布但未路由。
使用amqp.node,当我将队列绑定到交换机并开始使用“#”(全部)时,我没有得到任何东西。
我希望能够获得之前发布但未被发布的消息。这可能吗?
答案 0 :(得分:1)
我希望能够获得之前发布但未被发布的消息。这可能吗?
这不是直接可能的。
如果消息未在任何地方路由,它将消失在空白中。如果需要挂起,则必须将其路由到队列。无法获得以前无处发送的消息,并重新路由它。
您的解决方案选项非常有限。您必须始终确保将消息路由到队列。
如果您使用备用交换(https://www.rabbitmq.com/ae.html)通过不同的交换来路由无处可靠的消息,则可以执行此操作。
当消息无法通过第一次交换时,它将通过备用交换。此时,您必须确保消息进入队列。
稍后,当您需要处理通过备用交换的消息时,您将必须从当前所在的队列中读取消息,并通过正确的交换重新发布它。
答案 1 :(得分:0)
使用mandatory
标记处理未路由的消息,并以这种方式添加ReturnListener
:
final Connection connection = factory.newConnection();
final Channel channel = connection.createChannel();
channel.addReturnListener(new ReturnListener() {
public void handleReturn(int replyCode, String replyText, String exchange, String routingKey, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("unrouted messages here!!!");
}
});
bool isMandatory = true;
channel.basicPublish("my_exchange","not_routed",isMandatory,null,"not_routed_message".getBytes());
我不知道php
库是否支持此侦听器,但标准客户端可以这样做。
这是用户界面显示消息的方式:
Message published, but not routed.
答案 2 :(得分:0)
您正在寻找这个: https://www.rabbitmq.com/ae.html
如果未路由邮件,请指定备用交换。