2016-08-17 10 views
0

RabbitMQ Web UIの使用現在のキューバインディングがないトピック交換に公開すると、rabbitmqはメッセージが公開されているがルーティングされていないと言います。amqpで経路指定されていないメッセージを取得することはできますか?

amqp.nodeを使用すると、キューをExchangeにバインドし、「#」(すべて)を使用して消費を開始すると、何も取得できません。

以前に公開されているが経路指定されていないメッセージが届きます。これは可能ですか?

答えて

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ライブラリは、このリスナーをサポートしている場合、私は知らないが、標準のクライアントが行うことができますそれ。

Message published, but not routed.

チェックこの:面白いアイデアだhttps://github.com/rabbitmq/rabbitmq-management/blob/0f1013c57a7341a7fb0afc73d5b6b63fd9275c6d/src/rabbit_mgmt_wm_exchange_publish.erl#L73

+1

は、それがUIにメッセージを表示するために何をするかであることを!この場合、メッセージはプロデューサーに送り返され、後でストレージを処理して再公開することはできますか?配信されなかったメッセージをバッチアップして、何らかのタイマーを持ってパブリッシュすることができます。私はこれを念頭に置いておく必要があります。 :) –

+1

はい、あなたのメッセージは戻ってきますので、後で再発行したり、保存したりすることができます。 – Gabriele

関連する問題