アクティビティでフォルトが発生したときに何らかの処理を実行する場合,フォルト処理用のアクティビティを配置してフォルト処理を実行します。
フォルト処理は,フォルトが発生するアクティビティと,フォルト処理を行うアクティビティを連結して定義します。連結にはフォルトコネクションを利用します。
フォルト処理の定義手順を次に示します。
次の図に示すように,フォルトが発生した場合,フォルト処理を実行したあとに,フォルトが発生したアクティビティの次のアクティビティに処理が移ります。
図6-2 フォルト処理を実行したあとの処理の流れ
プロセス内にフォルトが返るおそれのあるアクティビティが複数あった場合,アクティビティごとにフォルト処理を定義するのではなく,一括してプロセスのフォルト処理を実行できます。その場合,次の図に示すようにスコープアクティビティを使って,プロセス内の処理を一つのまとまりにして,フォルト処理を定義します。
図6-3 スコープアクティビティを使って定義したフォルト処理
ビジネスプロセスのフォルト処理の定義で使用する電文フォーマットについて説明します。
複数のユーザ定義例外を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」という二つのフォルトに対応したフォルト電文が,「cscformat1.xsd」という一つの電文フォーマットで扱われています。
SOAPアプリケーション開発支援機能(Java2WSDLコマンド)を使用してrpcスタイルのWSDLを生成し,フォルトを扱えるように,「4.3.2 サービス部品電文を作成する(Webサービスの場合)」の注意事項の手順で修正したWSDLを基にアダプタを定義した場合も,同様の形式となります。
発生するフォルトに応じて処理を切り分けるために,この電文フォーマットをフォルトごとに別々の変数として定義し,[フォルト処理の割当]ダイアログで二つのcatchの割当変数として定義した場合,二つのcatchに割り当てられている変数のフォーマットは同一になってしまいます。そのため,どちらのフォルトが発生しても先に定義されているcatchに適合してしまい,要因に応じたフォルト処理が呼び出されません。
フォルト電文がこのようなフォーマットになっている場合は,次に示す方法でビジネスプロセスを定義して対処してください。
フォルトごとに変数を定義しないで,電文フォーマットが同一のフォルトに対して共通となる変数を一つ定義します。フォルト処理の遷移先も一つにし,[フォルト処理の割当]ダイアログで,共通となる変数を割り当てます。ただし,想定外のフォルト処理のために,別途catchAllの遷移先を設定することもできます。
フォルト処理の遷移先には分岐アクティビティを配置し,ルートの要素名などで発生したフォルトを切り分ける分岐条件を記述します。
共通となる変数を割り当てた場合の概念図を次に示します。
図6-4 共通となる変数を割り当てた場合の概念図
ルート要素名を取得して一致判定(図中の「ルート要素判定」)を実施する分岐条件の記述例を次に示します。
csc:getVariableData('Fault変数1','local-name(/*)')="StockShortageFault"
「Fault変数1」の部分にフォルト共通変数の変数名,「StockShortageFault」の部分にルート要素名を指定します。