使用RabbitMQ Web UI時,當我發佈到沒有當前隊列綁定的主題交換時,rabbitmq表示郵件已發佈但未路由。是否可以在amqp中獲得未路由的消息?
使用amqp.node,當我將隊列綁定到交換機並開始使用「#」(全部)使用時,我沒有收到任何東西。
我期待得到以前發佈但未路由的消息。這可能嗎?
使用RabbitMQ Web UI時,當我發佈到沒有當前隊列綁定的主題交換時,rabbitmq表示郵件已發佈但未路由。是否可以在amqp中獲得未路由的消息?
使用amqp.node,當我將隊列綁定到交換機並開始使用「#」(全部)使用時,我沒有收到任何東西。
我期待得到以前發佈但未路由的消息。這可能嗎?
我期待得到以前發佈但未路由的消息。這可能嗎?
這不是直接可能的。
如果消息沒有路由到任何地方,它將消失在虛空中。如果你需要堅持下去,你必須將它路由到隊列中。沒有辦法獲得以前發送過的消息,並重新路由它。
您的解決方法選項非常有限。您必須始終確保將消息路由到隊列。
如果您使用備用交換機(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.
這是一個有趣的想法!在這種情況下,該消息將被傳回給製作人,您可以稍後處理存儲並重新發布,對嗎?可以批量處理未傳送的消息,並有某種計時器重新嘗試發佈它們。我必須記住這一點。 :) –
是的,您將收到您的消息,並且您可以決定稍後重新發布,存儲等。 – Gabriele