2017-12-09 35 views
0

分散メッセージキューでCamelを使用するには?基本的に私は3つのサービスからなるシステムを持っています。ここで、AはSOAPクライアントとの同期境界です。 AコールサービスC が、代わりにサービスBから結果セットを取得します。。高可用性を保証するために、各サービスの複数のインスタンスが実行されます。Apache CamelとJMSクラスタ(分散キュー)

要求する結果が呼び出されたサービスと異なるサービスでなければならないため、非同期メッセージング(メッセージキュー)を使用する必要があります(CはBの結果セットを取得できません。同期的に連鎖されない)。最大の課題は、応答メッセージを正しいインスタンス/スレッドにルーティングすることです(Aは同期サービスで、結果を取得するまでブロックしています)。研究をした後、私はJMSが2つの手段、すなわちJMSCorrelationIDJMSReplyToヘッダーを提供していると考えました。 Camelはこれらのヘッダーを透過的に処理するようです。

enter image description here

しかし、さらに大きな課題があります。もちろん、高可用性を保証するためにメッセージ・キューの複数のインスタンスを実行する必要があります。いずれかのメッセージキューがダウンすると、システムは引き続き使用可能になります。

どのようなサポートCamelは分散キューにすぐに使用できますか? WeblogicでJMSクラスタを設定していて、これをCamelで利用したいとします。どのような特別な設定が必要ですか?シークレット結果メッセージと結果メッセージは同じキューまたはサーバーインスタンス上で瞑想することができないため、この例では2つの異なるキュー(またはキューのクラスタ)を使用していますが、依然としてメッセージ間の相関はすべて維持されなければなりません。

+0

あなたは非常に複雑な要件を満たしています。私はキャメルがインテグレーションではなくアプリケーションでなければならないように聞こえるので、あなたがここで必要としているものであるかどうかはわかりません。しかし、あなたがCamelの使用を主張するならば、[recipientList](http://camel.apache.org/recipient-list.html)を使って受信JMSキュー(とブローカー、私は推測します)を設定することができます実行時の計算 – noMad17

答えて

0

相関IDを使用してみましたか?このような

何か:

from("direct:myCall") 
.setProperty("myCorrelationId", constant("1")) 
.setBody(constant("MESSAGE")) 
.to("socket-tcp://SOCKET:16010") 
.toD("direct:aggregator") 
.end(); 

from("direct:aggregator") 
.aggregate(property("myCorrelationId"),(oldExchange, newExchange) -> { 
    if(oldExchange != null) { 
     /*do somenthing*/ 
    } 
    if(newExchange != null) { 
     /*Do something*/ 
    } 
    return newExchange; 
}).eagerCheckCompletion().completionSize(2) 
.to("log:foo") 
.end(); 

この例では、あなたは、相関IDと、この情報を使用して作業のための同じ相関IDを持つ2つのメッセージをお待ちしています集約ルートと電話を持っています。

関連する問題