6

Sql Service Broker は、次のヒューリスティックを使用して、アプリケーションが有用な作業を行うのを妨げているメッセージがキューにあるかどうかを判断します。

「Service Broker は、自動有害メッセージ検出を提供します。RECEIVE ステートメントを含むトランザクションが 5 回ロールバックすると、Service Broker は、キューの状態を自動的にオフに設定することにより、トランザクションがメッセージを受信したすべてのキューを無効にします。」( http://msdn.microsoft.com/en-us/library/ms166137.aspx )

私はこの基本的なアプローチで問題ありませんが、再試行の回数を 5 回から 20 回程度に変更する方法はありますか?

これが役立つ理由は、キューを処理するために現在使用しているコードが、約 10 個のワーカー スレッドを持つ Sql Server の外部のアプリであり、それぞれが独立した SqlConnection を持ち、それぞれが独自の独立したスレッドを実行するためです。 RECEIVE ステートメント。このアプリケーションがなんらかの理由で停止した場合、ワーカー スレッドごとに個別のロールバック トランザクションが発生する可能性があります。これは、キューを無効にするのに十分なロールバックです。対照的に、キューを無効にせずにアプリケーションを強制終了できるようにしたいと考えています。単一の SqlConnection を使用するようにアプリケーションを書き直す必要があるかもしれませんが、次のように言うことができれば、はるかに簡単になります。

ALTER QUEUE MyQueue SET RollbacksBeforePoison=20

そのようなことは可能ですか?

4

2 に答える 2

11

いいえ、ポイズンメッセージ検出のロールバックカウントは5にハードコードされており、変更することはできません。ただし、キューが無効になっている場合は、イベントのキューでイベント通知が発生します BROKER_QUEUE_DISABLED。このイベントをサブスクライブして、管理者に通知するか、キューを再度有効にするハンドラーを作成できます。また、アプリケーションはおそらく、外部アクティベーションメカニズムのようなものを利用して、スレッドプールサイズを着信メッセージのレートに調整することができます。

更新しました

SQL Server 2008 R2の時点で、次の新しいオプションがありますALTER/CREATE QUEUE

POISON_MESSAGE_HANDLING(STATUS = OFF/ON)

ポイズンメッセージ処理を有効にするかどうかを指定します。デフォルトはオンです。

ポイズンメッセージ処理がOFFに設定されているキューは、5回の連続したトランザクションロールバック後に無効になりません。これにより、カスタムポイズンメッセージ処理システムをアプリケーションで定義できます。

于 2009-09-02T02:09:05.413 に答える
0

毒物検出アルゴリズム (ロシア語) http://www.queue.net.ru/2010/06/poison-message-detection-algorithm.html

于 2010-06-16T15:40:34.907 に答える