Service Broker エラー メッセージの処理
エラー メッセージは、Service Broker で生成されるメッセージと、Service Broker を使用するアプリケーションで生成されるメッセージの 2 種類に分けられます。
Service Broker でメッセージ交換を続行できなくなるエラーが発生した場合に、メッセージ交換のエラー メッセージが生成されます。たとえば、交換先のサービスが現在のインスタンスに存在しないためにそのサービスを特定できない場合、ルーティング テーブルにサービスのエントリがなければ、メッセージ交換のエラー メッセージが作成されます。
アプリケーションは、エラーが発生したアクティブなメッセージ交換をいつでも終了できます。エラーが発生したメッセージ交換を終了すると、メッセージ交換のローカル側が終了し、リモート側にエラー メッセージが送信されます。ただし、リモート側が既にメッセージ交換を終了している場合、エラー メッセージは送信されません。そのままメッセージ交換を終了し、交換中のすべてのメッセージが削除されます。
エラー メッセージの Code 要素には、エラー コードが含まれています。Service Broker で生成されるエラー メッセージはエラー コードが負の値で、アプリケーションで生成されるエラー メッセージはエラー コードが正の値です。Service Broker で報告されるエラー コードは、エラー メッセージの発端となったエラーの値を単に負の値に変換したものです。たとえば、XML 検証エラー (エラー コード 9615) が発生した場合、Code 要素に値 -9615 を含むエラー メッセージがデータベース エンジンにより生成されます。
いずれの場合も、アプリケーションにエラーが通知されると、そのメッセージ交換ではそれ以上メッセージを送信できません。アプリケーションでエラーを処理してメッセージ交換を終了します。
エラーを処理するときに使用するロジックは、厳密にはアプリケーションによって異なります。たとえば、メッセージの保有を設定していて、タスクが失敗した場合の補正トランザクションを必要としている場合、プログラムから処理済みのメッセージの有無をキューに問い合わせて補正トランザクションを実行し、メッセージ交換を終了します。反対に、エラーが発生したことのみを記録すればよい場合、ログ テーブルにエラーを記録してメッセージ交換を終了します。
アプリケーション固有のエラー コードを使用して、メッセージ交換を終了するときに特定のエラーを伝えることができます。ただし、どのエラー メッセージでもメッセージ交換は終了します。メッセージ交換を必ずしも終了する必要がないエラーを伝える必要がある場合、そのようなエラーを示すメッセージの種類を定義できます。