RabbitMQ Web UIの使用現在のキューバインディングがないトピック交換に公開すると、rabbitmqはメッセージが公開されているがルーティングされていないと言います。amqpで経路指定されていないメッセージを取得することはできますか?
amqp.nodeを使用すると、キューをExchangeにバインドし、「#」(すべて)を使用して消費を開始すると、何も取得できません。
以前に公開されているが経路指定されていないメッセージが届きます。これは可能ですか?
RabbitMQ Web UIの使用現在のキューバインディングがないトピック交換に公開すると、rabbitmqはメッセージが公開されているがルーティングされていないと言います。amqpで経路指定されていないメッセージを取得することはできますか?
amqp.nodeを使用すると、キューをExchangeにバインドし、「#」(すべて)を使用して消費を開始すると、何も取得できません。
以前に公開されているが経路指定されていないメッセージが届きます。これは可能ですか?
以前に公開されているが経路指定されていないメッセージが届きます。これは可能ですか?
これは直接できません。
メッセージがどこにもルーティングされない場合、メッセージは無効になります。あなたがそれにぶら下がる必要がある場合は、それをキューにルーティングする必要があります。以前はどこにも送られなかったメッセージを取得し、それを再ルーティングする方法はありません。
回避策のオプションは非常に限られています。常にキューにメッセージがルーティングされるようにする必要があります。
これは、代替交換機(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
ライブラリは、このリスナーをサポートしている場合、私は知らないが、標準のクライアントが行うことができますそれ。
Message published, but not routed.
は、それがUIにメッセージを表示するために何をするかであることを!この場合、メッセージはプロデューサーに送り返され、後でストレージを処理して再公開することはできますか?配信されなかったメッセージをバッチアップして、何らかのタイマーを持ってパブリッシュすることができます。私はこれを念頭に置いておく必要があります。 :) –
はい、あなたのメッセージは戻ってきますので、後で再発行したり、保存したりすることができます。 – Gabriele