この章では、Oracle BPEL Process Managerでのトランザクションおよびフォルト伝播のセマンティクスについて説明します。
項目は次のとおりです。
リリース11gのトランザクション・セマンティクスでは、コンポーネントの実行に使用される基礎となるJava Transaction API(JTA)インフラストラクチャを使用できます。この項では、BPEL Process Managerのトランザクション・セマンティクスについて説明します。
以前のリリースと同様に、Oracle BPEL Process Managerでは、デフォルトの場合、リクエストに基づいて新規のトランザクションが作成されます。つまり、トランザクションが存在する場合は、そのトランザクションが一時停止され、新規のトランザクションが作成されます。子(新規)トランザクションが完了すると、マスター(一時停止された)トランザクションが再開します。
ただし、リクエストが非同期(一方向)の場合、トランザクションには次のいずれかの処理が適用されます。
デハイドレーション・ストア(dlv_message表)に挿入するために継承されます。
トランザクションに透過的に登録されます(トランザクションがある場合)。
メッセージの損失はありません。起動メッセージは、処理のためにデハイドレーション・ストアに挿入されるか、フォルトを介して顧客に通知されます。
リリース10.1.3.xでは、消費側プロセス(つまり、パートナ・リンク)と提供側プロセスに、複数のプロパティを設定していました。これらのプロパティを使用することで、実行を単一のグローバル・トランザクションにチェーンできました。消費側では、bpel.xmlファイルのパートナ・リンク・バインディングにtransaction=participateを設定しました。提供側では、bpel.xmlの<configurations>セクションにtransaction=participateを設定しました。
リリース11gでは、コールされるBPELコンポーネント(コール先プロセス)にのみtransactionという新しいプロパティを設定する必要があります。composite.xmlファイルのBPELプロセス・サービス・コンポーネント・セクションに、bpel.config.transaction(bpel.config.は必須の接頭辞)を追加します。このプロパティは、コールを開始するBPELインスタンスのトランザクション動作を構成します。
例12-1に詳細を示します。
例12-1 新規トランザクションの設定
<component name="InternalWarehouseService">
    <implementation.bpel src="InternalWarehouseService.bpel"/>
    <property name="bpel.config.transaction" 
         many="false" type="xs:string">required | requiresNew</property>
  </component>
使用可能な値は、requiredとrequiresNewの2つです。表12-1は、これらの値とその設定に基づいたBPELインスタンスの動作の要約を示しています。
表12-1 bpel.config.transactionプロパティの動作
| 対象 | bpel.config.transactionがrequiredに設定されている場合 | bpel.config.transactionがrequiresNewに設定されている場合 | 
|---|---|---|
| 
 リクエスト/レスポンス(開始)起動  | 
 トランザクションがある場合はコール元トランザクションが結合され、トランザクションがない場合は新規トランザクションが作成されます。  | 
 常に新規トランザクションが作成され、既存のトランザクションがある場合はそのトランザクションが一時停止されます。  | 
| 
 
  | 
 起動されたメッセージは、同じトランザクションの同一スレッドを使用して処理されます。  | 
 常に新規トランザクションが作成され、既存のトランザクションがある場合はそのトランザクションが一時停止されます。  | 
| 
 注意: bpel.config.transactionプロパティは、中間プロセスのreceiveアクティビティには適用されません。この場合は、別のトランザクションの別のスレッドを使用してメッセージが処理されます。これは、相関が必要で常に非同期で処理されるためです。 | 
bpel.config.transactionプロパティの設定方法の詳細は、C.1.1項「デプロイメント・ディスクリプタのプロパティの定義方法」を参照してください。
次の各項では、bpel.config.transactionをrequiredまたはrequiresNewに設定した場合のトランザクションおよびフォルト動作について説明します。
表12-2では、BPELCallerプロセスがBPELCalleeプロセスをコールします。BPELCalleeプロセスでは、bpel.config.transactionプロパティがrequiresNewに設定されています。表12-2は、bpel.config.transactionがこの値に設定されている場合のフォルト伝播とトランザクション動作を示しています。
表12-2 bpel.config.transactionがrequiresNewに設定されているBPELCalleeへのBPELCallerによるコール
| BPELCalleeの状態 | BPELCalleeトランザクションの処理 | BPELCallerの動作 | 
|---|---|---|
| 
 フォルトでリプライ(  | 
 保存されます。  | 
 フォルトを取得して捕捉します。  | 
| 
 処理されないフォルトをスロー(  | 
 ロールバックされます。  | 
 フォルトを取得して捕捉します。  | 
| 
 フォルト(FaultOne)でリプライ後、フォルト(FaultTwo)をスローした場合  | 
 ロールバックされます。  | 
 FaultTwoを取得します。  | 
| 
 ロールバックされます。  | 
 リモート・フォルトを取得します。  | 
表12-3では、BPELCallerプロセスがBPELCalleeプロセスをコールします。BPELCalleeプロセスでは、bpel.config.transactionプロパティがrequiredに設定されています。表12-3は、bpel.config.transactionがこの値に設定されている場合のフォルト伝播とトランザクション動作を示しています。
表12-3 bpel.config.transactionがrequiredに設定されているBPELCalleeへのBPELCallerによるコール
| BPELCalleeの状態 | BPELCallerの動作 | 
|---|---|
| 
 フォルトでリプライ(  | 
 フォルトを取得して捕捉します。BPELCallerがトランザクションを所有します。したがって、トランザクションを捕捉した場合、トランザクションはコミットされます。BPELCallerが処理しない場合は、グローバル・ロールバックが発生します。  | 
| 
 フォルトをスロー(  | 
 フォルトを取得して捕捉します。  | 
| 
 フォルト(FaultOne)でリプライ後、フォルト(FaultTwo)をスローした場合  | 
 FaultTwoを取得します。  | 
| 
 
  | 
 そのトランザクション・ロールバックを取得します。そのロールバックを捕捉する方法はありません。このフォルトは処理されません。  | 
たとえば、2つの同期プロセス(BPELMasterとBPELChild)を作成し、同じレコードを挿入する際にそれぞれが同じデータベース・アダプタ参照を使用するとします(したがって、権限キー(PK)違反が発生します)。双方にxADatasourceNameが設定されます。
bpel.config.transaction設定がないと、発生したフォルトは処理されず、BPELChildはロールバックされます。BPELMasterにcatchブロックがある場合、そのトランザクションはコミットされます。したがって、データベースのBPELMasterからのレコードで終了します。
BPELMasterでのフォルトも捕捉しなかった場合は、(2つの異なるトランザクションで)第2のロールバックを取得します。
同じテスト・ケースで、bpel.config.transactionがrequiredに設定され、フォルト・ハンドラが適切でない場合は、BPELMasterの未処理のフォルトに基づいてトランザクション全体がロールバックされます。
BPELChildからフォルトを捕捉してロールバック・フォルトをスローするように、BPELMasterにフォルト・ハンドラを追加すると、トランザクションはグローバルにロールバックされます。
この機能を使用して、トランザクション境界を管理し、エンドツーエンド・トランザクション・フローをモデル化できます(ソースおよびターゲットがトランザクションの場合)。
例12-2に示すように、一方向起動(および可能性のあるコールバック)は、一般的にWSDLで公開されます。
例12-2 WSDL公開
<wsdl:operation name="process">
        <wsdl:input message="client:OrderProcessorRequestMessage"/>
    </wsdl:operation>
これにより、BPELプロセス・サービス・エンジンでは実行が2つの部分に分割されます。
第1の部分(常にコール元トランザクション内)では、デハイドレーション・ストアのdlv_message表への挿入が行われます(リリース10.1.3.xでは、inv_message表に挿入されていました)。
第2の部分では、トランザクションおよび新規スレッドで作業アイテムが実行され、新規インスタンスが作成されます。
スレッドが使用可能な場合はサービス・エンジンのスレッド・プール(インボーカ・スレッド)で実行されるため、スケーラビリティの点で様々なメリットがあります。一方で、即時に実行される保証がないというデメリットがあります。
一方向の操作に基づく同期タイプのコールが必要な場合は、onewayDeliveryPolicyプロパティを使用できます。これは、リリース10.1.3.xのdeliveryPersistPolicyプロパティと同じです。
composite.xmlファイルのBPELプロセス・サービス・コンポーネント・セクションに、bpel.config.oneWayDeliveryPolicyを指定します。この値がcomposite.xmlに設定されていない場合は、Oracle Enterprise Manager Fusion Middleware ControlコンソールのシステムMBeanブラウザのoneWayDeliveryPolicyの値が使用されます。使用可能な値は、次のとおりです。
async.persist: メッセージは、データベース・ハッシュ・マップに保持されます。
sync.cache: メッセージはメモリーに格納されます。
sync: 同じスレッドで直接起動が発生します。
bpel.config.oneWayDeliveryPolicyプロパティの設定方法の詳細は、C.1.1項「デプロイメント・ディスクリプタのプロパティの定義方法」を参照してください。
表12-4は、メイン・プロセスがサブプロセスを非同期でコールする場合の動作を示しています。表12-4は、第12.1.1.1項「bpel.config.transactionがrequiresNewに設定されているBPELCalleeへのBPELCallerによるコール」および第12.1.1.2項「bpel.config.transactionがrequiredに設定されているBPELCalleeへのBPELCallerによるコール」に記載されているユースケースに基づいています。
表12-4 メイン・プロセスによる非同期でのサブプロセスのコール
| 条件 | サブプロセスがフォルトをスローした場合 | サブプロセスがbpelx:rollbackをスローした場合 | 
|---|---|---|
| 
 
 (BPELCalleeプロセスが別のスレッド/別のトランザクションで実行)  | 
 メッセージは配信サービスに保存されるため、BPELCallerはレスポンスを取得しません。フォルトが処理されない場合は、BPELCalleeトランザクションがロールバックされます。  | 
 メッセージは配信サービスに保存されるため、BPELCallerはレスポンスを取得しません。フォルトが処理されない場合は、BPELCalleeインスタンスがロールバックされます。  | 
| 
 
 および 
 (BPELCalleeが同じスレッド/別のトランザクションで実行)  | 
 BPELCallerは  | 
 BPELCallerは  | 
| 
 
 および 
 (BPELCalleeが同じスレッド/同じトランザクションで実行)  | 
 BPELCalleeがフォルト状態になります。BPELCallerは  | 
 トランザクション全体がロールバックされます。  |