一方向起動の実行の概要

次の例に示すように、一方向起動(および可能性のあるコールバック)は、一般的に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.xdeliveryPersistPolicyプロパティと同じです。

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に設定すると、一方向メッセージの到着頻度が配信の頻度よりかなり高い場合や、サーバー障害が発生した場合には、メッセージが失われる可能性があります。また、システムが過負荷の状態になり(メッセージがスケジュール済キューにたまり)、メモリー不足エラーが発生することもあります。各自のユースケース・シナリオを検討し、この設定が適切かどうかを判断してください。

    高可用性環境でoneWayDeliveryPolicyasync.cacheに設定すると、サーバー・クラッシュ発生時に実行途中の起動メッセージおよびコールバック・メッセージが失われたり、重複したりすることがあります。async.cacheに対しては、サーバーのフェイルオーバーはサポートされていません。

  • sync: 同じスレッドで直接起動が発生します。呼出しキューのメッセージのスケジューリングはバイパスされ、BPELインスタンスが同期的に呼び出されます。この設定は、データベースのパフォーマンスに影響を与えることがあります。

bpel.config.oneWayDeliveryPolicyプロパティの設定方法の詳細は、「BPELプロセス・サービス・コンポーネントの追加方法」および「プロパティ・インスペクタでデプロイメント・ディスクリプタのプロパティを定義する方法」を参照してください。

表13-4は、メイン・プロセスがサブプロセスを非同期でコールする場合の動作を示しています。表13-4は、「bpel.config.transactionがrequiresNewに設定されているBPELCalleeプロセスがBPELCallerプロセスによってコールされる」および「bpel.config.transactionがrequiredに設定されているBPELCalleeプロセスがBPELCallerプロセスによってコールされる」に記載されているユースケースに基づいています。

表13-4 メイン・プロセスによる非同期でのサブプロセスのコール

条件 サブプロセスがフォルトをスローした場合 サブプロセスがbpelx:rollbackをスローした場合

onewayDeliveryPolicy=async.persist

(BPELCalleeプロセスが別のスレッド/別のトランザクションで実行)

メッセージは配信サービスに保存されるため、BPELCallerはレスポンスを取得しません。フォルトが処理されない場合は、BPELCalleeトランザクションがロールバックされます。

メッセージは配信サービスに保存されるため、BPELCallerはレスポンスを取得しません。フォルトが処理されない場合は、BPELCalleeインスタンスがロールバックされます。

onewayDeliveryPolicy=sync

and

transaction=requiresNew

(BPELCalleeが同じスレッド/別のトランザクションで実行)

BPELCallerはFabricInvocationExceptionを受信します。フォルトが処理されない場合は、BPELCalleeトランザクションがロールバックされます。

BPELCallerはFabricInvocationExceptionを受信します。BPELCalleeトランザクションがロールバックされます。

onewayDeliveryPolicy=sync

and

transaction=required

(BPELCalleeが同じスレッド/同じトランザクションで実行)

BPELCalleeがフォルト状態になります。BPELCallerはFabricInvocationExceptionを受信します。BPELCallerにはフォルトを処理する機会があります。

トランザクション全体がロールバックされます。

onewayDeliveryPolicy=async.cache

and

transaction=requiresNew

または

transaction=required

リクエストが処理される前にコール元のスレッドが戻されるため、BPELCallerはレスポンスを取得しません。フォルトが処理されない場合は、BPELCalleeトランザクションがロールバックされます。メッセージは、データベースに保存されていないため、失われます。

リクエストが処理される前にコール元のスレッドが戻されるため、BPELCallerはレスポンスを取得しません。フォルトが処理されない場合は、BPELCalleeトランザクションがロールバックされます。メッセージは、データベースに保存されていないため、失われます。