Oracle® Fusion Middleware Oracle Business Process Management Studioでのビジネス・プロセスの開発 12c (12.2.1.2.0) E82789-01 |
|
前 |
次 |
この章では、ビジネス・プロセスの実行中に発生するエラーの処理方法を説明します。Oracle BPMでは、エラーをモデリングできる例外コンポーネントや、プロセスの実行中にそれらのエラーを処理できる複数のBPMN構造が用意されています。
この章の内容は次のとおりです。
エラーには2種類あります。システム・エラーおよびプロセス・エラーです。システム・エラーは、BPMNサービス・エンジンが実行されているソフトウェアまたはハードウェア・インフラストラクチャの障害の結果発生するもので、プロセス・エラーは、プロセス・フローそのものの中の予期しない状況です。
システム・エラーには様々な原因があります。システム・エラーの原因となる問題の例として、次のものがあげられます。
データベース接続の失敗
接続が失われた場合
ハード・ディスクの問題
プロセス・フロー内のシステム・エラーからリカバリするには、システム例外を使用できます。
プロセスでシステム例外を処理しない場合、Oracle Enterprise Managerが提供するフォルト・リカバリ・システムを使用してリカバリできます。詳細は、Oracle SOA SuiteおよびOracle Business Process Management Suiteの管理のエラー・ホスピタルでのフォルトのリカバリを参照してください。
プロセス・エラーは、プロセスの通常の開発を妨げる問題です。たとえば、発注プロセスの場合、リクエストされたアイテムの在庫がなければ、通常のプロセス・フローを続行できません。プロセス・フロー中のこのような予期しない状況を処理できます。この例の状況を処理する1つの方法は、顧客に注文を取り消してもらうか、または注文を後のために保存してもらうことです。
プロセス内の予期しない状況には、次のような一般的な例があります。
在庫の不足
ワークロードの制限の超過
金額の制限の超過
フィードバックの期限切れ
クレジット・カードの認証の問題
プロセスで例外が発生すると、そのBPMNプロセスを含むSOAコンポジットの状態に影響を及ぼします。例外がSOAコンポジットの状態に与える影響の詳細は、「BPMNエラーがSOAコンポジットのステータスに与える影響」を参照してください。
アクティビティおよびイベントを構成し、それらが完了した後にBPMランタイムがチェックポイントを追加するように強制できます。これを行うには、「実行後にコミットを強制」オプションを選択する必要があります。これは、BPELにおけるデハイドレーション・アクションに似ています。このオプションを使用すると、エラーが発生した場合にトランザクションをロールバックするような、冪等でないアクティビティの再実行をリカバリ時に回避できます。
ビジネス例外は、エラーではなく、プロセス設計の標準の一環とみなされています。コンポーネントをビジネス・カタログに追加する際、コンポーネントのサービスがエラーを生成できるよう指定されている場合、これらのエラーは、「エラー」事前定義済モジュール内のビジネス・カタログでビジネス例外として表示されます。
サービスを起動すると、例外が発生する場合があります。これらの例外を処理するには、境界エラー・キャッチ・イベントまたはイベント・サブプロセスを使用します。
また、ビジネス・カタログでビジネス例外を定義できます。その後、特定の条件下でトリガーされたエラー終了イベントでこれらのビジネス例外を使用できます。エラー終了イベントにより例外が生成され、親プロセスが例外を処理できます。
システム例外は、プロセスの実行中に発生する場合がある低レベルのエラーを表します。場合によっては、プロセス内でこの低レベル・エラーを処理する必要があることがあります。プロセス・フロー内でシステム例外を処理するには、その例外を捕捉し、システム例外を使用するようにエラー・キャッチ・イベントを構成する必要があります。
サービスまたは別のBPMNプロセスの実行中に、システム例外が発生する場合があります。特定のシステム例外をスローするようにプロセスを設計します。スロー・イベントまたは終了イベントで使用できる唯一の例外は、ロールバックです。他のすべてのサポートされるシステム例外は、キャッチ・エラー・イベントの開始にのみ使用可能です。
システム例外には、タイプが「任意」であるerrorInfo属性が含まれます。どのような値でもこの属性に割り当てることができます。タイプがAnyであるため、この値は任意の型に属することができます。通常は、アプリケーションのトラブルシューティング用に、例外の原因または重要情報を格納するためにこの属性を使用します。
エラー・イベントの実装プロパティから、使用可能なシステム例外のリストのみを表示できます。
表18-1で、サポートされるシステム例外について説明します。また、システム例外が存在するモジュールおよび指定されたシステム例外を使用できるエラー・イベントも示します。
表18-1 システム例外
システム例外 | モジュール | 説明 | エラー・イベント |
---|---|---|---|
AssertFailure |
Bpel |
指定したアサーションが失敗したことを示しています。 |
キャッチ、開始 |
BindingFault |
Bpel |
フロー・オブジェクトで起動された操作の準備に失敗したことを示しています。たとえば、WSDのロードに失敗しました。BindingFault後は起動を再試行することはできず、通常、このエラーからのリカバリには管理者操作が必要になります。 |
キャッチ、開始 |
InvalidVariables |
Bpel |
使用された変数が無効であることを示しています。 |
キャッチ、開始 |
RemoteFault |
Bpel |
フロー・オブジェクトでのサービスの起動に問題があったことを示しています。たとえば、リモート・サービスがSOAPフォルトを戻しました。 |
キャッチ、開始 |
Timeout |
Soap |
サービスがレスポンスのタイムアウト期間を超過したことを示しています。 |
キャッチ、開始 |
ConflictingReceive |
Soap |
起動された操作に応答する複数の受信アクティビティが存在することを示しています。 |
キャッチ、開始 |
ConflictingRequest |
Soap |
起動された操作の同じパートナ・リンクに対して複数のリクエストが存在することを示しています。 |
キャッチ、開始 |
CorrelationViolation |
Soap |
メッセージが必要な相関情報を提供していないことを示しています。 |
キャッチ、開始 |
ForcedTermination |
Soap |
SOAPフォルトが発生したため、サービスが終了されたことを示しています。 |
キャッチ、終了 |
InvalidReply |
Soap |
応答に、対応する受信が必要とする相関情報が含まれていないことを示しています。 |
キャッチ、開始 |
MismatchedAssignmentFailure |
Soap |
割り当てられたタイプに互換性がないことを示しています。 |
キャッチ、開始 |
RepeatedCompensation |
Soap |
補正ハンドラが複数回起動されることを示しています。 |
キャッチ、開始 |
SelectionFailure |
Soap |
選択操作の実行時にエラーがあったことを示しています。 |
キャッチ、開始 |
UninitializedVariable |
Soap |
アクセスしている変数が初期化されないことを示しています。 |
キャッチ、開始 |
Rollback |
Soap |
例外の受信者が、プロセス・フロー内からの現在のJTAトランザクションをロールバックできるようにします。 |
スロー、終了 |
システム例外またはビジネス例外のフローは、例外が発生した場所に応じて異なります。
次のものの実行中に例外が発生する可能性があります。
タスク
サブプロセス
再使用可能なプロセス
例外の原因となるタスクがBPMNサービス・エンジンによって実行された場合に行われる処理を、次に説明します。
BPMNサービス・エンジンは、例外をスロー可能なサービスを起動するタスクを実行します。
SOAPエラーが発生してタスクが失敗し、このエラーはBPMNサービス・エンジンによって例外に変換されます。
タスクに境界キャッチ・エラー・イベントが付属している場合、インスタンスは境界キャッチ・エラー・イベントで定義されたフローを使用して例外を処理します。例外処理フローにより、メイン・プロセス・フローを再開することも可能です。メイン・プロセス・フローを再開しない場合、プロセスは境界キャッチ・エラー・イベントで終了します。
タスクに境界キャッチ・エラー・イベントが関連付けられていない場合、例外はプロセス・レベルに伝播します。
プロセス・レベルでは、次のオプションが可能です。
プロセスに、例外を捕捉できるイベント・サブプロセスが含まれておらず、フォルト・ポリシーを定義していない場合、BPMサービス・エンジンによってこのエラーがOracle Enterprise Managerのフォルト・リカバリ・システムのログに記録されます。
プロセスに、例外を捕捉するよう構成されたタイプ・エラーの開始イベントを持つイベント・サブプロセスが含まれている場合、インスタンスは例外処理フローを継続します。インスタンスが例外処理フローを完了すると、プロセスは終了します。
次のシーケンスで、例外の原因となるサブプロセスがBPMNサービス・エンジンによって実行された場合に行われる処理を説明します。
BPMサービス・エンジンにより、例外または終了エラー・イベントをスローするサービスを起動するタスクの含まれたサブプロセスが実行されます。
次のイベントのいずれかが発生します。
タスクが例外をスローする。
サブプロセスがエラー・イベントで終了します。
タスクで例外が発生し、タスクに境界キャッチ・エラー・イベントが含まれているか、またはサブプロセスに例外を処理できるイベント・サブプロセスが含まれている場合、例外は親プロセスに伝播されません。
サブプロセスがエラー・イベントで終了するか、例外がタスクで発生して処理されない場合、例外は親プロセスに伝播されます。
次の場合、親プロセスは例外を処理できます。
サブプロセスに境界キャッチ・イベントが付属しています。
例外を捕捉するよう構成されたイベント・サブプロセスが含まれています。
親プロセスが例外を処理できない場合、その親プロセスに例外が伝播されます。親プロセスがない場合、例外はEnterprise Managerのフォルト・リカバリ・システムのログに記録されます。
次のシーケンスで、例外の原因となる再使用可能なサブプロセスを起動するコール・アクティビティが、BPMNサービス・エンジンによって実行された場合に行われる処理を説明します。
BPMサービス・エンジンにより、例外または終了エラー・イベントをスローするサービスを起動するタスクの含まれた、再使用可能なプロセスが実行されます。
次のイベントのいずれかが発生します。
タスクが例外をスローする。
再使用可能なプロセスが、エラー・イベントで終了する。
タスクで例外が発生し、タスクに境界キャッチ・エラー・イベントが含まれているか、または再使用可能なプロセスに例外を処理できるイベント・サブプロセスが含まれている場合、例外は親プロセスに伝播されません。
サブプロセスがエラー・イベントで終了するか、例外がタスクで発生して処理されない場合、例外は親プロセスに伝播されます。
次の場合、親プロセスは例外を処理できます。
コール・アクティビティに境界キャッチ・イベントが付属しています。
例外を捕捉するよう構成されたイベント・サブプロセスが含まれています。
親プロセスが例外を処理できない場合、その親プロセスに例外が伝播されます。親プロセスがない場合、例外はEnterprise Managerのフォルト・リカバリ・システムのログに記録されます。
アクティビティで発生した例外は、境界エラー・キャッチ・イベントまたはイベント・サブプロセスを使用して処理できます。境界エラー・キャッチ・イベントを使用すると、例外を処理した後にメイン・プロセス・フローを再開できます。例外処理フローをプロセス内の複数のタスクで再利用したい場合、イベント・サブプロセスの方が境界キャッチ・イベントよりも効率的です。
キャッチ・エラー・イベントはイベント・サブプロセス間に置かれるため、イベント・サブプロセスを使用する方が簡潔なプロセスを定義でき、手間もかかりません。境界キャッチ・イベントを使用して例外処理フローを再利用する場合、各タスクに対して境界キャッチ・イベントを定義し、その後、それらの協会イベントを例外処理フローに接続する必要があります。
図18-1に、境界エラー・キャッチ・イベントを使用してエラーを処理するプロセスを示します。
また、イベント・サブプロセスを使用すると、サブプロセスが自らのデータ・オブジェクトを定義できるのと同様に、イベント・サブプロセス内からのみアクセス可能なデータ・オブジェクトを定義できます。
図18-2に、イベント・サブプロセスを使用してエラーを処理するプロセスを示します。
フロー・オブジェクトの実行によって例外が発生する可能性があることがわかっている場合、境界エラー・キャッチ・イベントを使用して例外を処理するようプロセスを設計できます。
境界エラー・キャッチ・イベントを使用して例外を処理するには:
境界エラー・キャッチ・イベントが付随しているタスクの実行中にBPMNサービス・エンジンがエラーに遭遇すると、境界エラー・キャッチ・イベントによって定義されたフローを使用します。境界エラー・キャッチ・イベントによって定義された例外処理フローは、メイン・プロセス・フローを再結合するか、またはプロセスを終了できます。
BPMNプロセスでフロー・オブジェクトを実行中に発生する可能性のある例外を処理する際、イベント・サブプロセスを使用できます。
イベント・サブプロセスを使用して例外を処理するには:
プロセス内のタスクの実行中にイベント・サブプロセスで処理された例外が発生すると、BPMNサービス・エンジンは、イベント・サブプロセスで定義された例外処理フローの実行を続けます。
エラー・イベントを構成してビジネス例外を捕捉することができます。エラー・イベントを構成してビジネス例外を捕捉するには、エラー・イベント実装プロパティを編集する必要があります。
エラー・イベントの実装プロパティを構成してビジネス例外を捕捉するには:
このプロセスの実行中に発生するすべてのビジネス例外を処理する場合、「すべてのビジネス例外の捕捉」を選択します。
特定のビジネス例外を捕捉したい場合:
「タイプ」セクションで、「エラー別」を選択します。
「エラー別」リストから「参照」を選択します。
「参照タイプ」ダイアログ・ボックスが表示されます。
「システム・フォルトの表示」オプションを選択解除します。
例外の名前を入力するか、ツリーから選択します。
必要に応じて、エラー・イベントを構成して例外からリカバリできます。これを行うには、「リカバリ可能なエラー」オプションを選択します。
エラーからリカバリするには、値を事前定義済変数アクションに設定する必要があります。詳細は、「例外からリカバリするためのキャッチ・イベントの構成」を参照してください。
「OK」をクリックします。
「参照タイプ」ダイアログ・ボックスが閉じ、「例外」フィールドに選択した例外が表示されます。
エラー・イベントを構成してシステム例外を捕捉することができます。エラー・イベントを構成してシステム例外を捕捉するには、エラー・イベント実装プロパティを編集する必要があります。
エラー・イベントの実装プロパティを構成してシステム例外を捕捉するには:
このプロセスの実行中に発生する可能性のあるすべてのシステム例外を処理する場合、「すべてのシステム例外の捕捉」を選択します。
特定のビジネス例外を捕捉したい場合:
「タイプ」セクションで、「エラー別」を選択します。
「エラー別」リストから「参照」を選択します。
「参照タイプ」ダイアログ・ボックスが表示されます。
「システム・フォルトの表示」を選択します。
ツリーは使用可能なシステム・フォルトを示しています。各種のエラー・イベントでサポートされる例外のリストについては、表18-1を参照してください。
例外の名前を入力するか、ツリーから選択します。
必要に応じて、エラー・イベントを構成して例外からリカバリできます。これを行うには、「リカバリ可能なエラー」オプションを選択します。
エラーからリカバリするには、値を事前定義済変数アクションに設定する必要があります。詳細は、「例外からリカバリするためのキャッチ・イベントの構成」を参照してください。
「OK」をクリックします。
「参照タイプ」ダイアログ・ボックスが閉じ、「例外」フィールドに選択した例外が表示されます。
プロセス・フローの実行中に例外が発生した場合、そのプロセス・フローを開始したフロー・オブジェクトの実行を再試行するか、プロセス・インスタンスをメイン・プロセス・フローの次のフロー・オブジェクトに移動するかを選択できます。
これは、特定の値を事前定義済変数アクションに設定することで定義できます。事前定義済変数アクションの値は、次の方法で設定できます。
データ・アソシエーションの使用
詳細は、「データ・アソシエーションの概要」を参照してください。
BPMスクリプトの使用
詳細は、「BPMスクリプトの記述」を参照してください。
アクション事前定義済変数に使用可能な値は次のとおりです。
OK
これは、アクション変数のデフォルト値です。アクション変数にこの値が設定されていると、例外が発生した場合に、プロセス・インスタンスが例外処理フロー内の次のフロー・オブジェクトに移動します。例外が発生したときに実行されていたプロセス・フローは取り消されます。失敗したスコープは取り消されます。このアクションの使用は、アクティビティがtryブロック内にあり、ハンドラがcatchブロックにあるtry-catchとみなすことができます。
この値をアクション事前定義済変数に代入するには、文字列sendを使用します。
BACK
アクション変数にこの値が設定されていると、例外が発生した場合に、例外が発生したフロー・オブジェクトにプロセス・インスタンスが戻され、失敗したフロー・オブジェクトの実行が再試行されます。場合によっては、例外が発生した状況が変わり、フロー・オブジェクトの実行を再試行すると正常に実行されます。たとえば、電話をかけようとしたが回線が使用中であると、数分後に再試行します。
この値をアクション事前定義済変数に代入するには、文字列backを使用します。
SKIP:
アクション変数にこの値が設定されていると、例外が発生した場合に、プロセス・インスタンスがメイン・プロセス・フロー内の次のアクティビティに移動します。
この値をアクション事前定義済変数に代入するには、文字列skipを使用します。
エラー終了イベントを使用しているビジネス例外のみスローできます。これにより、親プロセスのみがこれらの例外を捕捉できます。タスクの実行中に発生する低レベルの例外をスローするかわりに、カスタマイズされた高レベルの例外をスローするようにプロセスを構成できます。
高レベルの例外をスローするには、エラーをスローする終了イベントにアクティビティ内の境界イベントを接続するか、またはサブプロセス・イベントをエラー終了イベントで完了します。
BPMNサービス・エンジンはプロセスを中断し、例外を親プロセスにスローします。サブプロセスにエラー・キャッチ境界イベントが付随しているか、または親プロセスにエラー・イベントを処理できるイベント・サブプロセスが存在する場合、親プロセスは例外を処理できます。そうでない場合、親プロセスは例外をその親プロセスにスローします。親プロセスがない場合、例外はBPMNサービス・エンジンによってOracle Enterprise Managerのフォルト処理システムのログに記録されます。
キャッチ・エラー・イベントはイベント・サブプロセス間に置かれるため、イベント・サブプロセスを使用する方が簡潔なプロセスを定義でき、手間もかかりません。
サブプロセスで発生した例外は、他のBPMNアクティビティで例外を処理する場合と同様に処理できます。
プロセスが別のピア・プロセスと通信するとき、そのピア・プロセスでいずれかのフロー・オブジェクトを実行するとエラーが発生する場合があります。同期的な操作の場合、このエラーを起動元のピア・プロセスに伝播する正しい形式では、エラーとして構成されたメッセージ・イベントを使用しています。
エラーとして構成されたメッセージ・イベントは、起動元のピア・プロセスに、プロセスの実行中にエラーが発生したことを伝達します。ただし、これは予期されたエラーであるため、監査証跡ではプロセスが正常に実行されたと示されます。
起動元のピア・プロセスがこれらのオプションのいずれかを使用して例外を処理する方法を定義する必要があります。
ピア・プロセスを起動するフロー・オブジェクトに、境界エラー・キャッチ・イベントを追加します。
起動元のピア・プロセスに、例外を処理するイベント・サブプロセスを追加します。
起動元のピア・プロセスでエラー処理を行わない場合、エラーは伝播され、プロセスの実行は正常に完了しません。
注意:
エラーがない場合にインスタンスが使用するパスを必ず定義しておく必要があります。エラーがない場合のパスを定義しないと、プロジェクトが正常にビルドされません。
エラー・イベントの使用とエラー・メッセージ・イベントの使用の相違点
プロセス間通信中のエラー処理にエラー終了イベントまたはスロー・イベントを使用することは、お薦めできません。エラー・イベントは、プロセス内で処理されるか、次のレベルに伝播される可能性がある内部エラーに対してのみ使用する必要があります。これらのエラーは、このプロセスの外では意味がありません。
ピア・プロセスの実行中に発生した例外は、起動元のピア・プロセスに伝播されません。ピア・プロセスが応答を停止しため、最終的には、起動元のピア・プロセスがタイムアウト通知を受信します。
プロセス間通信に使用されるプロセスで操作を実行するとエラーが発生する可能性があるとわかっている場合は、メッセージ終了イベントまたはスロー・イベントを追加して、起動元のピア・プロセスにエラーを伝播することをお薦めします。
メッセージ・エラーを実装するには、ビジネス例外を選択する必要があります。プロジェクトでビジネス例外を定義しない場合、ビジネス例外を作成する必要があります。ビジネス例外の詳細は、「ビジネス例外の使用」を参照してください。
メッセージ・イベントを使用してピア・プロセスでエラーを処理するには: