3

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

使用 amqp.node,当我将队列绑定到交换机并使用“#”(全部)开始消费时,我什么也得不到。

我期待收到以前发布但未路由的消息。这可能吗?

4

3 回答 3

3

我期待收到以前发布但未路由的消息。这可能吗?

这是不可能的。

如果一条消息没有路由到任何地方,它就会消失在虚无中。如果您需要坚持使用它,则必须将其路由到队列。无法获取以前发送到任何地方的消息并重新路由它。

您的解决方法选择非常有限。您必须始终确保将消息路由到队列。

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

当消息无法通过第一个交换时,它将通过备用交换。此时,您必须确保消息进入队列。

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

于 2016-08-17T12:38:56.833 回答
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库是否支持这个监听器,但标准客户端可以做到这一点。

这是 UI 显示消息的方式:

Message published, but not routed.

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

于 2016-08-17T14:01:54.123 回答
0

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

如果消息未路由,请指定替代交换。

于 2020-10-20T07:00:52.517 回答