私は、リクエストハンドラ(ブロードキャスト)とアグリゲータの両方として、IISでホストされたWebサービス(WCF)を使用して、かなり簡単にscatter-gather patternを実装しました。IISホストWCFサービスを使用して「サガタイムアウト」を実装していますか?
すべては、標準NetMsmqBinding
、片方向メッセージ契約、WASを使用するとかなりスムーズに実行されます。しかし今、ビジネスルールを導入して、アグリゲータが最終的な応答のために一定の時間(おそらく数日)を待つだけです。それらの一部またはすべてが受信されない場合は、バッチを閉じて、それが持つ情報を公開する必要があります。通常は、すべてのエンドポイントが報告されたときにのみ公開を開始します。
ブロードキャストメッセージにメッセージの有効期限を設定できるので、エンドポイントが不要な作業を行う時間を無駄にすることはありませんが、早期公開をトリガするのはどうでしょうか?
NServiceBusはファーストクラスの市民としてタイムアウトを正常に処理します.BizTalkは実際には1つのオーケストレーションとして分散収集全体を実装しています。しかし、私はこの1つの要件のためだけに新しいツールやサービスを展開する必要はありません。
WCFとMSMQだけを使用して長時間バッチタイムアウトアクションを実装する方法はありますか?
(アゲイン - アグリゲータは、IISでホストされているので、私はちょうどタイマーを設定することはできません。。アプリケーションプールは、いつでもリサイクルまたはシャットダウンすることができる)
これは...既に完了しています。これは、散布集団がどのように機能するかです。アグリゲーターとベンダーの間にはつながりがありません。私が必要とするのはタイムアウトです。要求ごとまたはインスタンスごとのタイムアウトである必要はなく、バッチ全体で1つだけです。私はNServiceBusを見て、可能な限り使用していることを保証しますが、2,3日以内にシステム全体を改装することはできません。 – Aaronaught
十分に公正。だから私は、アグリゲータがタイムアウトを呼び出して返された結果を公開するためにバッチがいつ送られたのかを知る必要があると仮定します。アグリゲータにバッチの詳細を含むメッセージを送信して、タイムアウトのメカニズムを設定してから、期間が過ぎると公開することはできませんか?そうすれば、各バッチごとに異なるタイムアウト期間を設定することができます。問題は、タイムアウトのメカニズムに何を使用するのかです。 – stephenl
すべてのリクエスト情報は既に追跡されています。難しい部分は、アグリゲータ(または他のいくつかのWebサービス - 同じIISアプリケーションにあれば問題ありません)が、タイムアウトが切れたときに実際にアクティブになることを確認しています。だから私はIISとWASを使用していることを数回述べました。タイムアウトを設定するのは簡単ですが、アプリケーションプールがリサイクルまたはシャットダウンされていれば、それはあまり効果がありません。 – Aaronaught