Hitachi

Cosminexus V11 BPM/ESB基盤 サービスプラットフォーム 開発ガイド 基本開発編


5.4.4 フォルト処理を定義する

アクティビティでフォルトが発生したときに何らかの処理を実行する場合,フォルト処理用のアクティビティを配置してフォルト処理を実行します。

フォルト処理は,フォルトが発生するアクティビティと,フォルト処理を行うアクティビティを連結して定義します。連結にはフォルトコネクションを利用します。

〈この項の構成〉

(1) フォルト処理の定義手順

フォルト処理の定義手順を次に示します。

  1. フォルトが発生するアクティビティとフォルト処理を行うアクティビティをキャンバスに配置し,詳細を定義します。

    フォルト処理を行うアクティビティは複数定義できます。

    アクティビティの配置方法については,「5.4.1 アクティビティを配置する」を参照してください。各アクティビティの定義方法の詳細については,「5.6 アクティビティの定義」を参照してください。

  2. フォルトコネクションを利用してフォルトが発生するアクティビティとフォルト処理を行うアクティビティを連結します。

    アクティビティの連結方法については,「5.4.2(2) 連結の設定方法」を参照してください。また,フォルトコネクションを利用できるアクティビティについては,「5.4.2(5) アクティビティの連結条件」を参照してください。

  3. 連結線をダブルクリックします。

    [フォルト処理の割当]ダイアログが表示されます。

    [フォルト処理の割当]ダイアログの入力・表示内容の詳細については,マニュアル「サービスプラットフォーム リファレンス」の「1.4.6 フォルト処理の割当ダイアログ」を参照してください。なお,フォルト処理に割り当てられる変数はメッセージ型(XML)だけです。メッセージ型(non-XMLおよびany)は割り当てられません。

  4. フォルト処理の条件を定義します。

    フォルトの対象となる変数と,フォルトが発生した場合に処理する連結先のアクティビティを,それぞれ[割当変数]および[遷移先]ドロップダウンリストで指定します。

    定義していないフォルトが発生した場合のフォルト処理を設定する場合,[割当変数]ドロップダウンリストで「catch-all」を選択します。

    サービスアダプタからサービス部品を呼び出したときに発生したエラーの例外を,サービスアダプタでフォルト電文に変換する場合,変数の定義で設定した定義ファイルを[割当変数]ドロップダウンリストで選択します。定義ファイルの設定方法については,「5.5.1(6)(a) 新規に変数を定義する場合」を参照してください。

  5. [OK]ボタンをクリックします。

次の図に示すように,フォルトが発生した場合,フォルト処理を実行したあとに,フォルトが発生したアクティビティの次のアクティビティに処理が移ります。

図5‒2 フォルト処理を実行したあとの処理の流れ

[図データ]

(2) 一括してプロセスのフォルト処理を実行する場合の定義

プロセス内にフォルトが返るおそれのあるアクティビティが複数あった場合,アクティビティごとにフォルト処理を定義するのではなく,一括してプロセスのフォルト処理を実行できます。その場合,次の図に示すようにスコープアクティビティを使って,プロセス内の処理を1つのまとまりにして,フォルト処理を定義します。

図5‒3 スコープアクティビティを使って定義したフォルト処理

[図データ]

(3) ビジネスプロセスのフォルト処理の定義で使用する電文フォーマット

ビジネスプロセスのフォルト処理の定義で使用する電文フォーマットについて説明します。

(a) 複数のフォルト名に対応する電文フォーマット

複数のユーザ定義例外をthrowするJavaプログラムから,SOAPアプリケーション開発支援機能(Java2WSDLコマンド)を使用してDocumentスタイルのWSDLを生成し,これを入力としてサービスアダプタを定義すると,サービスアダプタ定義画面の[フォルト電文]に表示される複数のフォルト名に対応する電文フォーマットは,同一のものとなります。この場合,電文フォーマットは,次の例に示すような複数のルート要素を含む形式になっています。

複数のフォルト名に対応する電文フォーマット(ルートスキーマ)の例
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="http://service"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://service"
  xmlns:tns2="http://data.service"
  xmlns:tns3="http://fault.service">
  <xsd:import namespace="http://data.service"
              schemaLocation="cscformat2.xsd"/>
  <xsd:import namespace="http://fault.service" 
              schemaLocation="cscformat3.xsd"/>
  <xsd:element name="order">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="in0" type="tns2:OrderData"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="orderResponse">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="orderReturn" type="tns2:OrderResult"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="StockShortageFault"
               type="tns3:StockShortageFault"/>
  <xsd:element name="InvalidCustomerFault"
               type="tns:InvalidCustomerFault"/>
  <xsd:complexType name="InvalidCustomerFault">
    <xsd:sequence>
      <xsd:element name="CustomerName" type="xsd:string"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>

上記の例では,「StockShortageFault」と「InvalidCustomerFault」という2つのフォルトに対応したフォルト電文が,「cscformat1.xsd」という1つの電文フォーマットで扱われています。

SOAPアプリケーション開発支援機能(Java2WSDLコマンド)を使用してrpcスタイルのWSDLを生成し,フォルトを扱えるように,「4.3.2 サービス部品電文を作成する(Webサービスの場合)」の注意事項の手順で修正したWSDLを基にサービスアダプタを定義した場合も,同様の形式となります。

発生するフォルトに応じて処理を切り分けるために,この電文フォーマットをフォルトごとに別々の変数として定義し,[フォルト処理の割当]ダイアログで2つのcatchの割当変数として定義した場合,2つのcatchに割り当てられている変数のフォーマットは同一になってしまいます。そのため,どちらのフォルトが発生しても先に定義されているcatchに適合してしまい,要因に応じたフォルト処理が呼び出されません。

フォルト電文がこのようなフォーマットになっている場合は,次に示す方法でビジネスプロセスを定義して対処してください。

(b) 定義方法

フォルトごとに変数を定義しないで,電文フォーマットが同一のフォルトに対して共通となる変数を1つ定義します。フォルト処理の遷移先も1つにし,[フォルト処理の割当]ダイアログで,共通となる変数を割り当てます。ただし,想定外のフォルト処理のために,別途catchAllの遷移先を設定することもできます。

フォルト処理の遷移先には分岐アクティビティを配置し,ルートの要素名などで発生したフォルトを切り分ける分岐条件を記述します。

共通となる変数を割り当てた場合の概念図を次に示します。

図5‒4 共通となる変数を割り当てた場合の概念図

[図データ]

ルート要素名を取得して一致判定(図中の「ルート要素判定」)を実施する分岐条件の記述例を次に示します。

csc:getVariableData('Fault変数1','local-name(/*)')="StockShortageFault"

「Fault変数1」の部分にフォルト共通変数の変数名,「StockShortageFault」の部分にルート要素名を指定します。