2011-10-20 21 views
0

2つの.NETアプリケーション間でメッセージングにService Brokerを使用することを検討しています。私はイニシエータ側でこれがどのように見えるかについてかなり良い考えがあります。.NETアプリケーション間のメッセージングにSQL Server Service Brokerを使用する

ただし、コンシューマアプリケーションでは、キューからメッセージを読み込んで処理を行い、処理がうまくいったことを確認する必要があります。処理が失敗する可能性があります。この場合、メッセージを再試行する必要があります。私はまた、歴史のために処理されたすべてのメッセージを保持する必要があります。

私が知る限り、RECEIVEを実行すると、メッセージはキューから削除されます。だから、失敗した場合の消費者向けアプリケーションはどうすればよいでしょうか?メッセージを再びキューにプッシュしますか?メッセージを「処理中」としてマークし、タスクが正常に完了したらメッセージを削除できますか?

Service Brokerを使用してこれをモデル化するにはどうすればよいですか?

+0

Service Brokerはすばらしいことです.Sql Serverの内部または間にメッセージングが必要な場合に便利です。 2つの.NETアプリケーション間の通信では、SQL Server Service BrokerではなくWCFを見ていきます... –

+0

私は永続的な非同期キューが必要です。一方または両方のアプリケーションが終了すると、エンキューされたアイテムは失われません。 WCFには私にそれを与えるものはありますか? MSMQまたはその他の分散メッセージキューは(残念ながら)現在のところこのプロジェクトのオプションではありません。 – driis

+0

MSMQがオプションでないのはなぜですか?それはそこにあり、それはすべてのWindows Serverで無料で、WCFとうまく統合されています...それはあなたのニーズに完璧にフィットするでしょう、私は信じています... –

答えて

3

エラーが発生した場合、トランザクション内でトランザクションを受信して​​トランザクションをロールバックすることができます。ただし、組み込みの有害なメッセージの処理では、指定されたメッセージに対して5回のロールバックが行われた後にキューが無効になります。

+0

各タスクは完了するまでに数秒かかることがあります。それは悪い習慣ではないだろうとキュー内の競合がその期間オープントランザクションを維持する原因になりますか? – driis

+1

@driis:特に待ち行列とRECEIVEは、長期間存続するトランザクションの存在下でうまくいくように設計されています。新しいメッセージのエンキューは、RECEIVEトランザクションによるロックの保持と競合せず、並行RECEIVEは並行して処理できます。 http://msdn.microsoft.com/en-us/library/ms171615.aspx –

+0

を参照してください。処理が本当に*長かったら、デキュー、状態テーブルの更新、タイマーのエンキュー**、コミットと処理の開始が必要です。 。成功した場合は、タイマーをリセットします。失敗した場合、タイマーが起動し、アプリケーションロジックは保存された状態を読み込み、**新しいタイマーをエンキューし**、コミットして再度試みます。 http://msdn.microsoft.com/en-us/library/ms187804.aspxを参照してください。 –

関連する問題