是否可以在amqp中获取未路由的消息?

时间:2016-08-17 04:40:58

标签: rabbitmq amqp node-amqp php-amqp

使用RabbitMQ Web UI,当我发布到没有当前队列绑定的主题交换时,rabbitmq表示该消息已发布但未路由。

使用amqp.node,当我将队列绑定到交换机并开始使用“#”(全部)时,我没有得到任何东西。

我希望能够获得之前发布但未被发布的消息。这可能吗?

3 个答案:

答案 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.

检查一下:https://github.com/rabbitmq/rabbitmq-management/blob/0f1013c57a7341a7fb0afc73d5b6b63fd9275c6d/src/rabbit_mgmt_wm_exchange_publish.erl#L73

答案 2 :(得分:0)

您正在寻找这个: https://www.rabbitmq.com/ae.html

如果未路由邮件,请指定备用交换。