2016-03-21 5 views
0

私はRabbitMQで新しく、キューでそれを消費する前にメッセージを修正したいと思います。私は触れることができないはずの交換をしています。クライアントは、特定のルーティングキーを使用してメッセージを受信します。しかし、そこにはたくさんのものがあり、キューにそれらを公開する前にボディをフィルタリングして変更したいと思っています。Rabbitmq:消費する前に本文を変更する

Exchangeがメッセージを取り込むには、次のようになります。

{ 
"_context_domain": "unsuitable", 
"_msg_id": "1", 
"_context_quota_class": null, 
"_context_read_only": false, 
"_context_request_id": "1" 
} 

{ 
"_context_domain": "suitable", 
"_msg_id": "2", 
"_context_quota_class": null, 
"_context_read_only": false, 
"_context_request_id": "2" 
} 

がかかる前にそれらをフィルタリングし、修正する方法はありますか?たとえば :

... 
channel.queueBind(QUEUE_NAME, "EXCHANGE_NAME", "ROUTNG_KEY"); 
final Consumer consumer = new DefaultConsumer(channel) { 
     @Override 
     public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { 
       String message = new String(body, "UTF-8"); 
       Gson mapper = new Gson(); 
       SomeObject object = (SomeObject) mapper.fromJson(message, SomeObject.class); 
        if (SomeObject.getContext_domain = "suitable"){ 
          //publish somehow SomeObject.getMsg_id into QUEUE_NAME 
} 
} 

はそれを行うための方法はありますか?

+0

こんにちは!私はあなたが欲しいものを理解しているか分からない。キューのメッセージをフィルタリングし、条件によっては別のキューにキューを追加することを意味しますか? –

+0

ご迷惑をおかけして申し訳ありません。私が見た限りでは、キューから交換機からすべてのメッセージを消費する方法しかありません。メッセージをキューに公開する前に、メッセージを変更してフィルタリングする方法を見つけられませんでした。それも可能ですか?私はメッセージがキューに入れられることを望んでいません、キューがメッセージフォームの交換を消費するとき、それをフィルタリングして変更したいです。私は本当にあなたが理解して欲しいです。質問が不明な場合は本当に申し訳ありません –

+0

申し訳ありません、それは大丈夫です:-)私は今理解して、あなたの質問に答えようとします。 –

答えて

1

AMQPでサポートされている交換は、メッセージ本文のフィルタリングを許可しません。ルーティングキーまたはメッセージヘッダーに基づいてメッセージをルーティングできる"topic" or "header" exchangesを使用できます。

ただし、メッセージ自体を変更することはできません。そうしたい場合は、交換を実装する独自のRabbitMQプラグインを開発する必要があります。

あなたがその道に行きたいなら、それはとても簡単です。しかし、エクスチェンジは正確にはこの目的のために設計されたものではなく、単にルーティングテーブルです。これを行うと、RabbitMQのチャネルプロセスは、必要な変更を行うためにリソースを消費します(つまり、交換はプロセスではなく、基本的にテーブルの行です)。つまり、同じ接続上の他のクライアントが、メッセージの修正とキュー登録を完了するまでブロックされる可能性があります。

消費者がすべてのメッセージを処理し、そこに必要なフィルタリングや変更を行い、その結果を第2のキューに入れることが、より一般的な方法です。この2番目の待ち行列は、通常の作業者によって消費されます。

+0

素晴らしい!どうもありがとう!私が探していた正確な答え! –

関連する問題