[BPM] Oracle BPM 11g Exception Handling

原文はこちら。
https://blogs.oracle.com/bpmtech/entry/bpm_exception_handling

ビジネス例外とシステム例外

BPMNは例外に基づくエラー処理機構を提供しています。これらの例外をエラー捕捉イベントを使って処理し、コンポジットのサービスアクティビティやBPMプロセスの終了イベントを使って例外を投げます。
エラーイベントは、(catchイベントが配置されている範囲に応じて)現在のアクティビティやプロセス、サブプロセスを停止することを考慮することが重要です。すなわち、その範囲内のアクティビティがエラーを補償した後に再開されません。このことを後で例示しましょう。

ビジネス例外

ビジネス例外はプロセスフロー内の予期せぬビジネスプロセスのエラーを処理します。これを使うと、メインフローでは通常のユースケース(所謂Happy Path)を辿り、別のフローではプロセス例外を処理するような、複雑性を減らしたプロセスを作成することができます。
JDeveloperでは、エラーを発生しうるコンポーネントをビジネスカタログに追加すると、こうしたエラーが事前定義済みモジュールのエラーのビジネス例外として現れます。

システム例外

システム例外は、BPMサービスエンジンが動作しているソフトウェアやハードウェア基盤でのエラーの結果であるシステムエラーを処理します。このエントリの範囲では、データベースアダプタやWebサービスアダプタが挙げるシステム例外を捕捉することにフォーカスします(サービスアダプタはSOAコンポジットが有しています)。

システム例外の種類

最もよく使われるシステムフォルトの二つはBinding FaultとRemote Faultです。Remote Faultを使いサービスが対応できないエラーを捕まえ、Binding Faultはその他のシステムエラー、例えば間違った呼び出しなどのために使います。外部サービスを利用する場合に基盤が返すFaultを以下にまとめました。
フレックスフィールドの要素名例外フォルト
データベースアダプタ DBAdaperの停止時 BindingFault
SQL問い合わせ時 RemoteFault
(表が存在しない)
PL/SQLパッケージの例外 BindingFault
(‘raise_application_error’)
WebサービスとしてのPL/SQL(JDeveloperのウィザードから) PL/SQLの例外 RemoteFault (‘raise_application_error’)
サービス停止時 RemoteFault
SOAP Webサービス リモート例外 RemoteFault
間違った引数タイプ RemoteFault

例外捕捉の方法

BPMプロセスでは、例外(ビジネス例外、システム例外とも)を様々な方法で捕捉できます。
  • イベントサブプロセス
  • 境界イベント
    • サブプロセスに添付
    • アクティビティに添付

イベントサブプロセス

以下の図は、RemoteFaultとBindingFaultを処理するための2個のイベントサブプロセスを持つプロセスの例です。

「サービスタスク(Service Task)」が例外を投げ対応する補償サブプロセスが終了すると、プロセスが終了します。つまり、上の例では、DBInfoVisualizationタスクは実行されません。

次のプロセスではこの問題を解決しています。

DBViewInfoタスクはErrorCompensationサブプロセスの後に実行されます。

サブプロセスに添付した境界イベント

次のプロセスは、DatabaseアダプタもしくはWebサービスの呼びだしで例外が発生した場合に実行される補償目的のサブプロセスを示しています。先ほどのシナリオに似ていますが、補償プロセスの再利用の可能性が追加されています。

補償サブプロセスが終了するとフローはDBViewInfoアクティビティに遷移します。つまり、Databaseアダプタが例外を投げるとWebサービスの呼びだしは実行されません。

アクティビティに添付した境界イベント

以下の図ではRemoteFaultもしくはBindingFaultをアクティビティが投げた場合に呼び出される補償サブプロセスを示しています。

エラーイベントによって現在のアクティビティが止まるので、一つ以上の例外を同じアクティビティもしくはサブプロセスで捕捉すると、そのうちの一つのみを処理します。
以下の図では次のサービスを様々に呼びだす典型的なコンポジションサービスを示しています。
  • Webサービス(外部Java SOAP Webサービス)
  • SQL問い合わせのためのデータベースアダプタ
  • PL/SQL実行のためのデータベースアダプタ
  • Webサービスとして公開されたPL/SQLパッケージ(JDeveloper 11gのウィザードを利用)
そして、それらが投げる例外を処理します。

重要なのは、例外を捕捉した際に以後のサービスを呼び出さない、ということです。
(アーキテクチャの観点からすれば、おそらくこれはコンポジションサービスの設計が適切ではありませんが、この章の例示であり、エントリの目的に適っています)

境界イベントはコンポーネントパレットの「エラー捕捉イベント」にあります。

例外捕捉のため、エラーキャッチイベントをサービスアクティビティに配置する必要があります。
作成した境界イベントをダブルクリックして、捕捉する例外を定義することができます。以下のオプションから選択できます。
  • すべてのビジネス例外
  • すべてのシステム例外
  • 特定の例外
例外のスキーマを取得し、データアソシエーションを可能とするためには、(BPM 11gR1 PS3では)特定の例外を選択する必要があります。

[訳注]PS6でも同じです。



[注意]
PS4までは、製品のバグ番号10177932のため、最初の2個のオプション、つまりすべてのビジネス例外やすべてのシステム例外のいずれかを選択する場合、データアソシエーションを利用できませんでしたが、PS5以後では修正されています。

システム例外のリストを見るためには、「システム・フォルトの表示」をチェックする必要があります(サービスタスクで投げられる可能性があるシステムフォルトの確認のため、このエントリのSystem Exception Typesをご覧下さい)。

例外を使ってBPMサービスを拡張する

例外の一般的なグループ(すべてのビジネス例外もしくはすべてのシステム例外)を捕捉する場合、例外の操作はできないため、ビジネスカタログのエラーフォルダにある、対応するシステム例外スキーマを持つことが有用な場合があります。

以下の手順で作成できます。
  1. サービスのコントラクトWSDLを修正し、RuntimeExceptionスキーマを参照するFaultを追加する。
  2. <definitions xmlns:bpe="http://schemas.oracle.com/bpel/extension">
        <types>
            <xsd:schema>
        (…)
                <xsd:import namespace="http://schemas.oracle.com/bpel/extension" schemalocation="xsd/RuntimeFault.xsd"/>
            </xsd:schema>
        </types>
    (…)
        <message name="RuntimeFault">
            <part name="fault" type="bpe:RuntimeFaultMessage"/>
        </message>
    (…)
        <porttype name="PruebaSPV_JavaAsAWS">
            <operation name="XXXX">
                <input message="tns:inputXXXX"/>
                <output message="tns:outputXXXX"/>
                <fault message="tns:RuntimeFault" name="RuntimeFault"/>
            </operation>
        </porttype>
        <binding name="XXXXPortBinding" type="tns:XXXX">
            <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
            <operation name="XXXX">
                <soap:operation soapaction=""/>
                <input>
                    <soap:body use="literal"/>
                </input>
                <output>
                    <soap:body use="literal"/>
                </output>
                <fault name="RuntimeFault">
                    <soap:fault name="RuntimeFault" use="literal"/>
                </fault>
            </operation>
        </binding></definitions>
    (…)
  3. composite.xmlのService Adapterにエラーがないことを確認する
  4. プロセスで、クリアして、再度サービスを追加し、修正されたサービスを使用するすべてのサービスアクティビティをリフレッシュする。対応するデータ・アソシエーションを確認することを忘れずに。
  5. プロジェクトの強制リフレッシュ:JDeveloper 11gを再起動する。
  6. 例外がビジネスカタログのErrorsフォルダに現れることを確認する。
  7. JDeveloperでプロセスにサービスアクティビティを追加する。
これでFaultの内容にアクセスできます。

0 件のコメント:

コメントを投稿