是否有可能在amqp中获得未路由的消息



使用RabbitMQ web UI,当我发布到一个没有当前队列绑定的主题交换时,RabbitMQ说消息已经发布,但没有路由。

使用amqp

。当我将队列绑定到exchange并开始使用"#"(all)消费时,我没有得到任何东西。

我期望得到先前发布但未路由的消息。这可能吗?

我期望得到先前发布但未路由的消息。这可能吗?

这是不可能的。

如果消息没有被路由到任何地方,它将消失在空白中。如果您需要挂起它,则必须将其路由到队列。没有办法获取以前没有发送到任何地方的消息,并重新路由它。

你的变通选择是非常有限的。您必须始终确保消息被路由到队列。

如果您使用备用交换器(https://www.rabbitmq.com/ae.html)通过不同的交换器来路由无处可去的消息,则可以做到这一点。

当消息在第一次交换中无处可去时,它将通过备用交换。此时,您必须确保消息进入队列。

之后,当您需要处理经过备用交换的消息时,您将不得不从当前所在的队列中读取消息,并通过正确的交换重新发布消息。

通过使用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库是否支持这个监听器,但是标准客户端可以这样做。

是UI用来显示消息的:

Message published, but not routed.

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

你要找的是:https://www.rabbitmq.com/ae.html

如果消息没有被路由,则指定一个替代交换机。

相关内容

  • 没有找到相关文章

最新更新