この章では、Oracle BPEL Process Managerでのトランザクションおよびフォルト伝播のセマンティクスについて説明します。ここでは、コールを開始するBPELインスタンスのトランザクション動作の構成および一方向の起動の実行方法について説明します。トランザクションなしでビジネス・プロセスを実行する方法についても説明します。
この章では、次の項目について説明します。
リリース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
という新しいプロパティを設定する必要があります。次のようにbpel.config.transaction
を追加します。
新規BPELプロセスのための「BPELプロセスの作成」ダイアログ内。
既存のBPELプロセスのcomposite.xml
ファイル内のBPELプロセス・サービス・コンポーネント・セクション内(bpel.config.
の必須接頭辞に注意)。
このプロパティは、コールを開始するBPELインスタンスのトランザクション動作を構成します。
例13-1に詳細を示します。
例13-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つです。表13-1は、これらの値とその設定に基づいたBPELインスタンスの動作の要約を示しています。
表13-1 bpel.config.transactionプロパティの動作
対象 | bpel.config.transactionがrequiredに設定されている場合 | bpel.config.transactionがrequiresNewに設定されている場合 |
---|---|---|
リクエスト/レスポンス(開始)起動 |
トランザクションがある場合はコール元トランザクションが結合され、トランザクションがない場合は新規トランザクションが作成されます。 |
常に新規トランザクションが作成され、既存のトランザクションがある場合はそのトランザクションが一時停止されます。 |
|
起動されたメッセージは、同じトランザクションの同一スレッドを使用して処理されます。 |
常に新規トランザクションが作成され、既存のトランザクションがある場合はそのトランザクションが一時停止されます。 |
注意: bpel.config.transaction プロパティは、中間プロセスのreceiveアクティビティには適用されません。この場合は、別のトランザクションの別のスレッドを使用してメッセージが処理されます。これは、相関が必要で常に非同期で処理されるためです。 |
bpel.config.transaction
プロパティの設定方法の詳細は、第4.1.1項「BPELプロセス・サービス・コンポーネントの追加方法」およびC.1.1項「プロパティ・インスペクタでデプロイメント・ディスクリプタのプロパティを定義する方法」を参照してください。
次の各項では、bpel.config.transaction
をrequired
またはrequiresNew
に設定した場合のトランザクションおよびフォルト動作について説明します。
表13-2では、BPELCallerプロセスがBPELCalleeプロセスをコールします。BPELCalleeプロセスでは、bpel.config.transaction
プロパティがrequiresNew
に設定されています。表13-2は、bpel.config.transaction
がこの値に設定されている場合のフォルト伝播とトランザクション動作を示しています。
表13-2 bpel.config.transactionがrequiresNewに設定されているBPELCalleeへのBPELCallerによるコール
BPELCalleeの状態 | BPELCalleeトランザクションの処理 | BPELCallerの動作 |
---|---|---|
フォルトでリプライ( |
保存されます。 |
フォルトを取得して捕捉します。 |
処理されないフォルトをスロー( |
ロールバックされます。 |
フォルトを取得して捕捉します。 |
フォルト(FaultOne)でリプライ後、フォルト(FaultTwo)をスローした場合 |
ロールバックされます。 |
FaultTwoを取得します。 |
ロールバックされます。 |
リモート・フォルトを取得します。 |
throwアクティビティでのbpelx:rollback
拡張要素の指定方法の詳細は、第12.7.3項「throwアクティビティでbpelx:rollback拡張要素を使用してアクティビティをロールバックする方法」を参照してください。
表13-3では、BPELCallerプロセスがBPELCalleeプロセスをコールします。BPELCalleeプロセスでは、bpel.config.transaction
プロパティがrequired
に設定されています。表13-3は、bpel.config.transaction
がこの値に設定されている場合のフォルト伝播とトランザクション動作を示しています。
表13-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にフォルト・ハンドラを追加すると、トランザクションはグローバルにロールバックされます。
この機能を使用して、トランザクション境界を管理し、エンドツーエンド・トランザクション・フローをモデル化できます(ソースおよびターゲットがトランザクションの場合)。
throwアクティビティでのbpelx:rollback
拡張要素の指定方法の詳細は、第12.7.3項「throwアクティビティでbpelx:rollback拡張要素を使用してアクティビティをロールバックする方法」を参照してください。
例13-2に示すように、一方向起動(および可能性のあるコールバック)は、一般的にWSDLファイルで公開されます。
例13-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プロパティと同じです。
bpel.config.oneWayDeliveryPolicy
を次のように指定します。
新規BPELプロセスのための「BPELプロセスの作成」ダイアログ内。
既存のBPELプロセスのcomposite.xml
ファイルのBPELプロセス・サービス・コンポーネント・セクション内。
この値がcomposite.xml
に設定されていない場合は、Oracle Enterprise Manager Fusion Middleware ControlのシステムMBeanブラウザのoneWayDeliveryPolicy
の値が使用されます。使用可能な値は、次のとおりです。
async.persist
: メッセージはデータベースに保存されます。この設定の場合、信頼性は確保されますが、データベースのパフォーマンスに多少の影響が出ます。システムの全体的なパフォーマンスに影響が出ることもあります。これはデフォルト値です。
async.cache
: 受信した配信メッセージはメモリー内キャッシュにのみ保存されます。信頼性よりパフォーマンスを優先する場合は、この設定を検討してください。async.cache
に設定すると、一方向メッセージの到着頻度が配信の頻度よりかなり高い場合や、サーバー障害が発生した場合には、メッセージが失われる可能性があります。また、システムが過負荷の状態になり(メッセージがスケジュール済キューにたまり)、メモリー不足エラーが発生することもあります。各自のユースケース・シナリオを検討し、この設定が適切かどうかを判断してください。
高可用性環境でoneWayDeliveryPolicy
をasync.cache
に設定すると、サーバー・クラッシュ発生時に実行途中の起動メッセージおよびコールバック・メッセージが失われたり、重複したりすることがあります。async.cache
に対しては、サーバーのフェイルオーバーはサポートされていません。詳細は、『Oracle Fusion Middleware高可用性ガイド』を参照してください。
sync
: 同じスレッドで直接起動が発生します。呼出しキューのメッセージのスケジューリングはバイパスされ、BPELインスタンスが同期的に呼び出されます。この設定は、データベースのパフォーマンスに影響を与えることがあります。
bpel.config.oneWayDeliveryPolicy
プロパティの設定方法の詳細は、第4.1.1項「BPELプロセス・サービス・コンポーネントの追加方法」およびC.1.1項「プロパティ・インスペクタでデプロイメント・ディスクリプタのプロパティを定義する方法」を参照してください。
表13-4は、メイン・プロセスがサブプロセスを非同期でコールする場合の動作を示しています。表13-4は、第13.1.1.1項「bpel.config.transactionがrequiresNewに設定されているBPELCalleeプロセスがBPELCallerプロセスによってコールされる」および第13.1.1.2項「bpel.config.transactionがrequiredに設定されているBPELCalleeプロセスがBPELCallerプロセスによってコールされる」に記載されているユースケースに基づいています。
表13-4 メイン・プロセスによる非同期でのサブプロセスのコール
条件 | サブプロセスがフォルトをスローした場合 | サブプロセスがbpelx:rollbackをスローした場合 |
---|---|---|
(BPELCalleeプロセスが別のスレッド/別のトランザクションで実行) |
メッセージは配信サービスに保存されるため、BPELCallerはレスポンスを取得しません。フォルトが処理されない場合は、BPELCalleeトランザクションがロールバックされます。 |
メッセージは配信サービスに保存されるため、BPELCallerはレスポンスを取得しません。フォルトが処理されない場合は、BPELCalleeインスタンスがロールバックされます。 |
および
(BPELCalleeが同じスレッド/別のトランザクションで実行) |
BPELCallerは |
BPELCallerは |
および
(BPELCalleeが同じスレッド/同じトランザクションで実行) |
BPELCalleeがフォルト状態になります。BPELCallerは |
トランザクション全体がロールバックされます。 |
および
または、
|
リクエストが処理される前にコール元のスレッドが戻されるため、BPELCallerはレスポンスを取得しません。フォルトが処理されない場合は、BPELCalleeトランザクションがロールバックされます。メッセージは、データベースに保存されていないため、失われます。 |
リクエストが処理される前にコール元のスレッドが戻されるため、BPELCallerはレスポンスを取得しません。フォルトが処理されない場合は、BPELCalleeトランザクションがロールバックされます。メッセージは、データベースに保存されていないため、失われます。 |
throwアクティビティでのbpelx:rollback
拡張要素の指定方法の詳細は、第12.7.3項「throwアクティビティでbpelx:rollback拡張要素を使用してアクティビティをロールバックする方法」を参照してください。
トランザクションを必要とせずにビジネス・プロセスを実行できます。トランザクションは、プロセス実行の次の場合にのみ使用されます。
内部の処理状態をバックエンド・データ・ストアに格納する必要がある場合のデハイドレーション・ポイント。
プロセスの実行中に監査証跡やインスタンスのトラッキング関連データを格納する場合。
トランザクションなしでビジネス・プロセスを実行することは、次のようなシナリオで役立ちます。
たとえば、flowNアクティビティが2000個のブランチを生成するBPELプロセスがあると仮定します。各ブランチでは、応答時間が500msであるリモート同期Webサービスが起動されます。BPELプロセス・サービス・エンジンではflowNブランチを単一スレッドで個別に実行するため、2000個のブランチすべてを処理し、それぞれで同期Webサービスを起動すると、所要時間は1000秒近くかかり、この処理中にインスタンスはデハイドレーション・ポイントにアクセスしません。トランザクションの時間は1000秒に及ぶ可能性があり、タイムアウトが発生する場合があります(デフォルトのトランザクション・タイムアウトの設定は300秒です)。すべてを直接メモリーで実行できます。その際、トランザクションは不要です。
トランザクション期間は、ビジネス・プロセス実行のライフ・サイクルと結び付きます。たとえば、非同期BPELプロセスにreceiveアクティビティが含まれ、その後にassignアクティビティが続き、そこでは複雑なXSLトランスフォーメーションが大規模ドキュメントで実行され、所要時間が30秒になると仮定します。この後、クライアントへのコールバックが続きます。トランザクションで実行される場合、BPELプロセス・サービス・エンジンがトランザクションをreceiveアクティビティで起動し、インスタンス実行中にインスタンスのデータベース内部でロックを保持します。
別の方法として、すべてのアクティビティはメモリーで実行でき、エラーが発生すると廃棄できます。インスタンス実行中にデータベースの更新が発生しないため、トランザクションは必要ありません。インスタンス実行でBPELプロセス・サービス・エンジンでインスタンス状態などを更新するデハイドレーション・ポイントに達した場合にのみ、トランザクションが必要です。
BPELプロセスが、同期していて、BPELプロセス・サービス・エンジンのJTAトランザクションに参加している別のサービスまたはパートナ・リンクを起動すると仮定します(たとえば、BPELプロセスで、TransactionAttribute=REQUIRED
が設定されているTaskServiceBean
を起動する場合に、TaskServiceBean
タイムアウトがあり、トランザクションがロールバックされるなど)。BPELプロセス・サービス・エンジンのJTAトランザクションがロールバックされても、BPELプロセスではTaskServiceBean
のエラーを処理できません。
ビジネス・プロセスが同期サービスを起動した場合、そのサービスが複雑な処理を長時間実行すると、BPELプロセス・サービス・エンジンのトランザクションがタイムアウトする場合があります。同期サービスが適切に実行されても、ビジネス・プロセスでリモート・サービスからレスポンスを取得すると、BPELプロセス・サービス・エンジンはロールバックされます。
トランザクションなしでビジネス・プロセスを実行するには、「BPELプロセスの作成」ダイアログでBPELプロセスを作成するときに、「トランザクション」リストから「notSupported」を選択します。
設定すると、次の動作が発生します。
XA分散トランザクションの利点がすべて無効になります。
トランザクションに参加することを期待されているパートナ(つまり、パートナはTransactionAttribute
がMANDATORY
に設定されている)をビジネス・プロセスで起動できません。
ビジネス・プロセスからの起動はfire-and-forgetです。(つまり、起動が終了すると、パートナに配信されます。起動元のトランザクションが後でロール・バックされる場合でも、起動メッセージはロール・バックされません)。
bpel.config.transaction
がnotSupported
に設定されていても、デハイドレーション・ポイントは、内部BPELプロセス・エンジンの状態をバック・エンドに保存するためにトランザクションを開始します。これは、デハイドレーションの概念が引き続きビジネス・プロセスに適用されることを意味します。この機能では、assign、invokeやその他のアクティビティがトランザクションなしで実行されることのみが保証されます。
このプロパティは、コールを開始する場合にBPELインスタンスのトランザクション動作を構成します。表13-5に、bpel.config.
transaction
のプロパティ設定に基づいたBPELインスタンスの動作を説明します。
表13-5 トランザクションのプロパティ設定に基づくBPELプロセス・インスタンス動作
トランザクション・タイプ | トランザクション設定が「requiresNew」 | トランザクション設定が「required」 | トランザクション設定が「notSupported」 |
---|---|---|---|
リクエスト/レスポンス(開始) |
新しいトランザクションが実行用に作成されます。既存のトランザクションがある場合はそのトランザクションが一時停止されます。 |
プロセスがコール元トランザクション(存在する場合)に参加するか、新規トランザクション(トランザクションがない場合)を作成します。 |
ビジネス・トランザクションのアクティビティはトランザクションなしで実行されます。トランザクションは、内部サービス・エンジンおよびインスタンスの状態や監査の詳細を保存するためにのみ使用されます。 |
一方向(開始、 |
新規トランザクションが実行のために作成され、既存のトランザクションがある場合はそのトランザクションが一時停止されます。 |
起動メッセージは、同じトランザクションの同一スレッドを使用して処理されます。 |
ビジネス・トランザクションのアクティビティはトランザクションなしで実行されます。トランザクションは、内部サービス・エンジンおよびインスタンスの状態や監査の詳細を保存するためにのみ使用されます。 |
一方向非同期 |
適用されません。 |
適用されません。 |
ビジネス・トランザクションのアクティビティはトランザクションなしで実行されます。トランザクションは、内部サービス・エンジンおよびインスタンスの状態や監査の詳細を保存するためにのみ使用されます。 |
「BPELプロセスの作成」ダイアログで、トランザクションなしの同期BPELプロセスを作成できます。
トランザクションなしの同期BPELプロセスを作成する手順は、次のとおりです。
第4.1.1項「BPELプロセス・サービス・コンポーネントの追加方法」に従って、SOAコンポジット・アプリケーションにBPELプロセス・サービス・コンポーネントを作成します。
「テンプレート」リストから、「同期BPELプロセス」を選択します。
「トランザクション」リストから、「notSupported」を選択します。図13-1に詳細を示します。
「OK」をクリックします。
「BPELプロセスの作成」ダイアログで、トランザクションなしの非同期BPELプロセスを作成できます。
トランザクションなしの非同期BPELプロセスを作成する手順は、次のとおりです。
第4.1.1項「BPELプロセス・サービス・コンポーネントの追加方法」に従って、SOAコンポジット・アプリケーションにBPELプロセス・サービス・コンポーネントを作成します。
「テンプレート」リストから、「非同期BPELプロセス」を選択します。
「配信」リストから「同期」を選択します。
ダイアログがリフレッシュされ、「トランザクション」リストが表示されます。
「トランザクション」リストから、「notSupported」を選択します。図13-2に詳細を示します。
「OK」をクリックします。