2016-08-17 303 views
0

使用RabbitMQ Web UI時,當我發佈到沒有當前隊列綁定的主題交換時,rabbitmq表示郵件已發佈但未路由。是否可以在amqp中獲得未路由的消息?

使用amqp.node,當我將隊列綁定到交換機並開始使用「#」(全部)使用時,我沒有收到任何東西。

我期待得到以前發佈但未路由的消息。這可能嗎?

回答

1

我期待得到以前發佈但未路由的消息。這可能嗎?

這不是直接可能的。

如果消息沒有路由到任何地方,它將消失在虛空中。如果你需要堅持下去,你必須將它路由到隊列中。沒有辦法獲得以前發送過的消息,並重新路由它。

您的解決方法選項非常有限。您必須始終確保將消息路由到隊列。

如果您使用備用交換機(https://www.rabbitmq.com/ae.html)通過不同的交換機路由無處不在的消息,則可以完成此操作。

當消息通過第一次交換無處可去時,它將通過交替交換。在那個時候,你必須確保消息進入隊列。當您需要處理通過備用交換機的消息時,您必須從當前正在使用的隊列中讀取消息,並通過正確的交換機重新發布消息。

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

+1

這是一個有趣的想法!在這種情況下,該消息將被傳回給製作人,您可以稍後處理存儲並重新發布,對嗎?可以批量處理未傳送的消息,並有某種計時器重新嘗試發佈它們。我必須記住這一點。 :) –

+1

是的,您將收到您的消息,並且您可以決定稍後重新發布,存儲等。 – Gabriele

相關問題