永続的なクライアント側エラー
場合によっては、メッセージ キューによってメッセージが宛先キューに移動される場合があります。 たとえば、メッセージをクライアントからサーバーに移動することがキューのアクセス制御によって許可されていない場合、問題のあるメッセージは、クライアント側の配信不能キューに移動されます。 この場合、COM+ キューに登録されたコンポーネント サービスでは、例外クラスをコンポーネントに関連付けることができます。 例外クラスをコンポーネントに関連付けるには、コンポーネント サービス管理ツールのコンポーネント プロパティ ページにある [詳細設定] タブを使用します。 COM+ 管理機能の ExceptionClass カタログ コンポーネント属性を使用することにより、例外クラスをプログラムによって関連付けることもできます。
例外クラスは、IPlaybackControl を実装するコンポーネントの ProgID または CLSID として定義されます。 キューに登録されたコンポーネント サービスには、Xact 配信不能キューをスキャンする配信不能キュー モニターがあります。 キューにメッセージがある場合、配信不能キュー モニターはターゲット コンポーネントに関連付けられている例外ハンドラーをインスタンス化し、クライアント側の回復不可能なエラーが発生したことを示す IPlaybackControl::FinalClientRetry を呼び出します。
IPlaybackControl に加えて、例外ハンドラーは、例外を処理するサーバー コンポーネントと同じインターフェイス セットを実装する必要があります。 IPlaybackControl::FinalClientRetry が呼び出されると、キューに登録されたコンポーネントの実行時に、失敗したメッセージが例外ハンドラーに対して再生されます。 これにより、例外ハンドラーは、たとえば補正トランザクションを生成することにより、サーバーに移動できないメッセージの代替動作を実装することができます。
再生されたすべてのメソッド呼び出しを例外ハンドラーが完了した場合、メッセージが Xact 配信不能キューから削除されて、無視されます。 ただし、例外ハンドラーが、いずれかのメソッド呼び出しからエラー状態を返すことによりメッセージを中止した場合、メッセージは Xact 配信不能キューに返されます。 次の一連のイベントは、クライアント側の例外処理方法を示しています。
- メッセージ キューは、サーバーにメッセージを配信できず、メッセージを Xact 配信不能キューに配置します。
- 配信不能キュー リスナー (DLQL) は、Xact 配信不能キューでメッセージを検索します。
- DLQL は、メッセージからターゲット コンポーネント CLSID を取得し、例外クラスのチェックします。
- DLQL は、例外クラスをインスタンス化します。
- 例外クラスの IPlaybackControl の DLQL クエリ。
- DLQL は、例外クラスで IPlaybackControl::FinalClientRetry メソッドを呼び出します。
- DLQL は、メッセージから例外クラスへのプロパティおよびメソッド呼び出しをすべて再生します。
- 例外ハンドラーがトランザクションを正常に完了した場合、DLQL はメッセージを削除します。 例外ハンドラーは、IObjectContext::SetAbort を発行する可能性があり、メッセージは配信不能キューに残ります。
上記のいずれかの手順が失敗した場合、メッセージは Xact 配信不能キューに残ります。
開始されると、DLQL はメッセージ キュー トランザクション配信不能キューで各メッセージを読み取り、キューに登録された各コンポーネント メッセージの例外クラスをインスタンス化します。 キューを 1 回通過したら、新しいメッセージを待機します。 その後、新しい配信不能キュー メッセージが到着するたびに処理されます。
ここで説明したプロセスに介入する必要がある場合、または有害なメッセージを最後の静止キューから移動する必要がある場合、メッセージ ムーバー ユーティリティーを使用します。 メッセージ ムーバー ユーティリティーについて詳しくは、「エラーの処理」をご覧ください。
関連トピック