ヘッダーをスキップ
Oracle® Fusion Middleware Oracle SOA Suite開発者ガイド
11g リリース1 (11.1.1.7)
B56238-08
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

15 BPELプロセスでのイベントおよびタイムアウトの使用

この章では、イベントおよびタイムアウトの使用方法について説明します。ここでは、プロセスの続行または待機を選択するpickアクティビティの作成、receiveアクティビティに対するリクエスト/レスポンス操作のタイムアウト設定、有効期限を設定するためのwaitアクティビティの作成、メッセージ着信を待機するためのBPEL 2.0でのOnEventブランチの作成、および同期プロセスのタイムアウト設定を行う方法について説明します。

この章には次の項が含まれます:

15.1 イベントおよびタイムアウトの概念に関する概要

Webサービスはレスポンスを返すまでに長時間かかる場合があるため、BPELプロセス・サービス・コンポーネントでは一定の時間が経過した後、タイムアウトしてフローの残りを継続できることが必要です。

この章では、融資提案を提供するStar LoanというWebサービスからのレスポンスを1分間待機するBPELプロセス・サービス・コンポーネントのプログラミング例を説明します。Star Loanが1分以内にレスポンスを返さない場合、BPELプロセス・サービス・コンポーネントはUnited Loanという別のWebサービスからの融資提案を自動的に選択します。現実的には、時間の制限は48時間など1分より大きな値です。しかし、この例では、BPELプロセス・サービス・コンポーネントが正しく動作しているかどうかを確認するために、そのような長時間の待機は設定しません。

非同期Webサービスはレスポンスを返すまでに長時間かかる場合があるため、BPELプロセス・サービス・コンポーネントでは一定の時間が経過した後、タイムアウトしてフローの残りを継続できることが必要です。

pickアクティビティを使用して、指定された時間待機するか、作業の実行を続行するようにBPELフローを構成できます。有効期限を設定するには、waitアクティビティを使用します。

15.2 プロセスの継続または待機を選択するpickアクティビティの作成

pickアクティビティには2つのブランチがあり、それぞれに条件があります。最初に条件が満たされたブランチが実行されます。次の例では、1つのブランチの条件は融資提案を受け取ることで、もう1つのブランチの条件は指定の時間待機することです。

図15-1に概要を示します。(優先度に従って)次のアクティビティが発生します。

  1. invokeアクティビティがサービス(この場合はStar Loanからの融資提案に対するリクエスト)を開始します。

  2. 次に、pickアクティビティが開始されます。これには次の条件があります。

    • onMessage

      この条件には、Star Loan Webサービスからの融資提案の形式でリプライを受け取るためのコードが含まれています。onMessageコードは、タイムアウトが追加される前の、Star Loan Webサービスからのレスポンスを受け取るコードと一致します。

    • onAlarm

      この条件には、1分のタイムアウトのコードが含まれています。この時間はPT1Mとして定義されています。これは、タイムアウトまでに1分待機するという意味です。タイムアウト設定には、次の記号を使用します。

      • Sは秒

      • Mは分

      • Hは時間

      • Dは日

      • Yは年

      あまり一般的な例ではありませんが、時間制限が1315秒の場合は、PT1Y3D15Sと入力します。コードの残りの部分では、融資変数selectedおよびapprovedをfalseに設定し、年率(APR)を0.0に設定して、この情報をloanOffer変数にコピーしています。

      期間のフォーマットはBPEL標準によって指定されます。期間のフォーマットの詳細は、次の場所にある最新の「XML Schema Part 2: Datatypes」ドキュメントを参照してください。

      http://www.w3.org/TR/xmlschema-2/#duration
      
  3. 最初に条件が満たされたpickアクティビティのブランチが、BPELプロセス・サービス・コンポーネントにより実行されます。もう一方のブランチは実行されません。

図15-1 pickアクティビティの概要

図15-1の説明が続きます
「図15-1 pickアクティビティの概要」の説明

onMessageブランチは、操作を受信するという点でreceiveアクティビティに似ています。ただし、類似したパートナ・リンクおよびポート・タイプを待機し、操作が異なる複数のonMessageブランチを持つpickアクティビティを定義できます。したがって、操作ごとに個別のスレッドおよびパラレル処理を起動できます。この点は、操作が1つのみのreceiveアクティビティとは異なります。もう1つの違いは、(「インスタンスの作成」チェック・ボックスを選択することで)receiveアクティビティを使用してビジネス・プロセスの新しいインスタンスを作成できますが、これをpickアクティビティで実行することはできません。


注意:

BPEL 1.1のscopeアクティビティにおけるonMessageブランチと、BPEL 1.1および2.0のscopeアクティビティにおけるonAlarmブランチも作成できます。Oracle JDeveloperでscopeアクティビティを開き、左側でアイコンを参照して追加するブランチを検索します。


15.2.1 pickアクティビティの作成方法

pickアクティビティを作成する手順は、次のとおりです。

  1. SOAコンポジット・エディタで、BPELプロセス・サービス・コンポーネントをダブルクリックします。

  2. 「コンポーネント・パレット」で、「BPELコンストラクト」を展開します。

  3. pickアクティビティをデザイナにドラッグします。

    pickアクティビティにはonMessageブランチが含まれています。図15-2に例を示します。

    図15-2 pickアクティビティ

    図15-2の説明が続きます
    「図15-2 pickアクティビティ」の説明

  4. OnMessageブランチをダブルクリックします。

  5. 融資サービスからのレスポンスを受け取るように、その属性を編集します。図15-3に例を示します。

    図15-3 OnMessageブランチ

    図15-3の説明が続きます
    「図15-3 OnMessageブランチ」の説明

  6. pickアクティビティを選択します。

    OnMessageブランチおよびOnAlarmブランチを追加するためのアイコンが表示されます。

  7. 図15-4に示すように、「OnAlarmの追加」をクリックします。

    図15-4 onAlarmブランチの作成

    図15-4の説明が続きます
    「図15-4 onAlarmブランチの作成」の説明

    OnAlarmブランチが表示されます。

  8. 表示されたpickアクティビティのonAlarmブランチをダブルクリックし、時間制限を1分に設定します。図15-5に例を示します。

    図15-5 onAlarmブランチ

    図15-5の説明が続きます
    「図15-5 onAlarmブランチ」の説明

  9. 「OK」をクリックします。

15.2.2 pickアクティビティ作成時の処理内容

例15-1のコード・セグメントは、この操作のpickアクティビティに対する設計完了後の定義を示しています。

例15-1 pickアクティビティ

  <pick>
        <!--  receive the result of the remote process -->
        <onMessage partnerLink="LoanService"
            portType="services:LoanServiceCallback"
            operation="onResult" variable="loanOffer">
            
        <assign>
        <copy>
            <from variable="loanOffer" part="payload"/>
            <to variable="output" part="payload"/>
        </copy>
        </assign> 
        
       </onMessage>
       <!--  wait for one minute, then timesout -->
       <onAlarm for="PT1M">
            <assign>
                <copy>
                    <from>
                        <loanOffer xmlns="http://www.autoloan.com/ns/autoloan">
                            <providerName>Expired</providerName> 
                            <selected type="boolean">false</selected> 
                            <approved type="boolean">false</approved> 
                            <APR type="double">0.0</APR> 
                        </loanOffer>
                    </from> 
                    <to variable="loanOffer" part="payload"/>
                </copy>
            </assign>
       </onAlarm>
</pick>

15.2.3 BPEL 2.0の同時onMessageブランチに関する注意事項

BPEL 2.0のOracle BPEL Process Managerの実装では、pickアクティビティの同時onMessageブランチはサポートされていません。

開始アクティビティとして(どちらも相関定義でinitiatejoinに設定されている)2つのonMessageブランチと、起動を次々に転送する起動プロセスを持つpickアクティビティがプロセスにある場合、どちらの起動も、起動されたプロセスの同じインスタンスに到達すると想定されます。ただし、Oracle BPEL Process ManagerのBPEL 2.0の実装では、起動されたプロセスの2つのインスタンスは起動ごとに作成されます。

これは想定されている動作ですが、BPEL 2.0仕様に記載されているものとは異なります。

たとえば、同期BPELプロセスAがあり、2つのパラレル・ブランチを持つflowアクティビティがあると仮定します。

  • ブランチ1は、非同期BPELプロセスBで操作processMessage1を呼び出します。

  • ブランチ2は、非同期BPELプロセスBで操作processMessage2を起動します。起動は5秒間待機した後に行われます。その後、BPELプロセスAはBPELプロセスBからのコールバックで待機し、出力をクライアントに返します。

起動されたプロセスの1つのインスタンスを作成し、最初のインスタンスがアクティブで実行中の状態になった後、2番目の起動が行われるという考えです。

BPELプロセスBには、createInstanceyesに設定されたpickアクティビティがあります。pickアクティビティ内には2つのonMessageブランチがあります。

  • 一方のブランチはprocessMessage1操作に使用されます。この操作では、約10秒間スリープ状態になります。

  • もう一方のブランチはprocessMessage2操作に使用されます。この操作では、5秒間待機します。

どちらの操作も入力メッセージ・タイプは同じで、initiatejoinに設定して相関が定義されています。processMessage1が直接呼び出されてBPELプロセスBのインスタンスが作成され、それが10秒間スリープすると想定します。5秒後に、起動プロセスはprocessMessage2の起動をBPELプロセスBに転送し、この起動は新しいインスタンスを作成するのではなく、既存のインスタンスに進みます(相関IDが同じで、initiatejoinに設定されているため)。

ただし、起動ごとにBPELプロセスBの新しいインスタンスが作成され、結果は予測できません。

  • processMessage2操作のブランチが先に完了した場合、後続の割当て操作は失敗します。これは、processMessage1からの入力変数はnullと想定されるためです(そのインスタンスの場合)。

  • processMessage1操作のブランチが先に完了した場合、プロセスは一部の情報のみを含むコールバック・データを返します(processMessage2からの入力は含まれません)。

Oracle BPEL Process Managerの実装では、2つの操作(processMessage1またはprocessMessage2)のいずれかによって新しいインスタンスが作成されます。この実装により、すでに作成されたインスタンスがあるかどうかを確認するためにデータベース問合せを行う必要がなくなります。

この問題を解決するには、2つの異なる操作によって開始される2つのプロセスを作成します。

15.3 receiveアクティビティのリクエスト/リプライ操作および入力専用操作に対するタイムアウトの設定

BPELバージョン1.1および2.0における次のタイプの操作に対して、タイムアウト設定を指定できます。

この機能は、パートナ・コールバックのタイムアウト期間を指定する際に使用するpickアクティビティのonMessageブランチとonAlarmブランチの代替手段として提供されています。

図15-6に、中間プロセスのreceiveアクティビティのタイムアウトを設定する「タイムアウト」タブを示します。

図15-6 receiveアクティビティの「タイムアウト」タブ

図15-6の説明が続きます
「図15-6 receiveアクティビティの「タイムアウト」タブ」の説明

receiveアクティビティのリクエスト・リプライ操作および入力専用操作に対するタイムアウトを設定する前に理解しておく基本的な概念については、第15.3.1項「リクエスト/リプライ操作および入力専用操作に対するタイムアウトの概要」を参照してください。

Oracle JDeveloperでreceiveアクティビティのタイムアウトを設定する方法については、第15.3.2項「receiveアクティビティのタイムアウトの設定方法」を参照してください。

15.3.1 リクエスト・リプライ操作および入力専用操作に対するタイムアウトの概要

次の各項では、リクエスト・リプライおよび入力専用のタイムアウト操作の機能について説明します。

  • アクティビティの起動時からの相対的なタイムアウト設定

  • 絶対的な日時でのタイムアウト設定

  • XPath式を使用して動的に計算されるタイムアウト設定

  • アクティビティ・タイムアウト時にスローされるbpelx:timeoutフォルト

  • アクティビティ・タイムアウト時にBPELインスタンス監査証跡に追加されるイベント

  • サーバー再起動時にリカバリ可能なタイムアウト・アクティビティ

15.3.1.1 アクティビティの起動時からの相対的なタイムアウト設定

タイムアウト設定として、アクティビティの起動時からの相対的なタイムアウトを指定できます。この設定は、例15-2に示すBPEL 1.1用の構文を使用して相対的な期間として指定されます。

例15-2 BPEL 1.1におけるアクティビティの起動時からの相対的なタイムアウト設定

<receive | bpelx:for="duration-expr">
    standard-elements
</receive>

BPEL 2.0では、構文は例15-3のようになります。

例15-3 BPEL 2.0におけるアクティビティの起動時からの相対的なタイムアウト設定

<receive | <bpelx:for>'duration-expr'</bpelx:for>
    standard-elements
</receive>

このタイプでは、bpelx:for属性を使用して、XMLスキーマ・タイプ期間として評価される静的な値またはXPath式を指定します。アクティビティには、bpelx:for属性またはbpelx:until属性のいずれか一方のみを使用できます。

XPath式がマイナスの期間として評価された場合、タイムアウトは無視され、その期間の値が無効であることを示すインスタンス監査証跡にイベントが記録されます。

有効な期間の値が取得されると、アクティビティの有効期限は、現在のノード時間(そのノードが使用可能になってからのクラスタ時間)にその期間の値を加算した値に設定されます。たとえば、期間の値bpelx:for="'PT5M'"は、アクティビティが実行開始後5分以内にインバウンド・メッセージの着信を予定していることを示します。


注意:

現在、pickアクティビティのonMessageブランチにはタイムアウト設定属性が適用されません。これは、pickアクティビティのonMessageブランチとonAlarmブランチを使用した同じ機能が存在しているためです。


タイムアウト期間は、次のアクティビティにのみ指定できます。

  • 中間プロセスのreceiveアクティビティ

  • createInstance="true"の指定がないreceiveアクティビティ

receiveアクティビティは、インスタンス化された後にのみタイムアウトします。receiveアクティビティのエントリではタイムアウトになりません。

15.3.1.2 絶対的な日時でのタイムアウト設定

タイムアウト設定は、リクエスト/レスポンスreceiveアクティビティの絶対的な期限として指定できます。このタイプでは、例15-4に示すBPEL 1.1用の構文を使用します。

例15-4 BPEL 1.1における絶対的な日時でのタイムアウト設定

<receive bpelx:until="deadline-expr">
    standard-elements
</receive>

BPEL 2.0では、構文は例15-5のようになります。

例15-5 BPEL 2.0における絶対的な日時でのタイムアウト設定

<receive <bpelx:until>"deadline-expr"</bpelx:until>
</receive>

bpelx:until属性の予定有効期限は、現在時刻より少なくとも2秒後である必要があります。それ以外の場合は、タイマーが指定されていなかったかのように、タイマー・スケジュールを無視してスキップされます。

bpelx:until属性には、datetimeまたはdateのXMLスキーマ・タイプとして評価される静的な値またはXPath式を指定します。アクティビティには、bpelx:for属性またはbpelx:until属性のいずれか一方のみを使用できます。

XPathバージョン1.0は、XMLスキーマに対応していません。したがって、XPathバージョン1.0の組込み関数では、dateTime値やdate値を作成したり、操作することはできません。ただし、次のいずれかを実行できます。

  • XMLスキーマ定義に準拠する定数(リテラル)の記述、および期限値としての使用。

  • 使用可能ないずれかのタイプの変数(パート)からのフィールドの抽出、および期限値としての使用。

XPathバージョン1.0では、リテラルが文字列リテラルとして処理されますが、結果はdateTime値またはdate値の字句表記として解釈されます。

有効なdatetime値またはdate値が取得されると、アクティビティの有効期限が指定の日付に設定されます。たとえば、bpelx:until="'2009-12-24T18:00+01:00'"というdatetime値は、アクティビティが実行開始以降、インバウンド・メッセージの着信を遅くとも2009年12月24日午後6時(UTC+1)以前に予定していることを示します。


注意:

現在、pickアクティビティのonMessageブランチにはタイムアウト設定属性が適用されません。これは、pickアクティビティのonMessageブランチとonAlarmブランチを使用した同じ機能が存在しているためです。


タイムアウト日付は、次のアクティビティにのみ指定できます。

  • 中間プロセスのreceiveアクティビティ

  • createInstance="true"の指定がないreceiveアクティビティ

receiveアクティビティは、インスタンス化された後にのみタイムアウトします。receiveアクティビティのエントリではタイムアウトになりません。

15.3.1.3 XPath式を使用して動的に計算されるタイムアウト設定

リクエスト/レスポンスreceiveアクティビティ、入力専用receive(コールバック)アクティビティおよびpickアクティビティのonMessageブランチに対するタイムアウト設定は、静的な期間またはdatetime値を入力するかわりに、XPath式を使用して設定できます。この場合は、次のいずれかを式の値として返す必要があります。

  • XMLの静的な期間またはdatetime値と解釈される文字列

  • XMLスキーマの期間またはdatetimeタイプ

例15-6に、BPEL 1.1でXPath式を使用するための構文を示します。

例15-6 BPEL 1.1でXPath式を使用して動的に計算されるタイムアウト設定

<bpelx:for="bpws:getVariableData('input', 'payload',
 '/tns:waitValue/tns:for')"/>

<bpelx:until="bpws:getVariableData('input', 'payload',
 '/tns:waitValue/tns:until')"/>

返された式の値をXMLスキーマの期間またはdatetimeタイプと解釈できない場合は、無効な期間またはdatetimeの値が指定されたことを示すインスタンス監査証跡にイベントが記録され、アクティビティの有効期限は設定されません。

15.3.1.4 アクティビティ・タイムアウト時にスローされるbpelx:timeoutフォルト

bpelx:forまたはbpelx:until属性から、有効なXMLスキーマの期間またはdatetime値が返された場合は、タイムアウトしたアクティビティからbpelx:timeoutフォルトがスローされます。このフォルトはcatchまたはcatchAllブロックによって捕捉され、通常のBPELフォルトと同様に処理されます。フォルトのメッセージはアクティビティの名前になります。また、タイムアウト期間より前に、想定したコールバック・メッセージの受信に失敗したためにアクティビティがタイムアウトしたことを示すインスタンス監査証跡にイベントが記録されます。

タイムアウト期間より前にアクティビティがパートナからコールバックを受信した場合、フォルトはスローされません。コールバックを受信したときにアクティビティがタイムアウトしていた場合、コールバック・メッセージはアクティビティに配信されず、配信メッセージ表に取消しのマークが設定されます。コールバック・メッセージの処理と同時にタイムアウト・アクションが試行された場合、そのタイムアウト・アクションは無視されます。11g リリース1現在、インスタンスはオプティミスティックにロックされます(リリース10gのペシミスティック・ロックとは対照的です)。したがって、行の第2のアクションがそのまま実行されます。

操作に対するフォルトがコンポーネントWSDLに宣言されている場合は、BPELコンポーネントからbpelx:timeoutフォルトをスローできます。操作に対するフォルトが宣言されていない場合、フォルトはFabricInvocationException(実行時フォルト)に変換されます。このフォルトは、いずれかのコール元コンポーネント(BPELコンポーネントを含む)によって捕捉されますが、フォルトのタイプはbpelx:timeoutではなくなります(ただし、フォルト・メッセージ文字列には、フォルトが当初はタイムアウト・フォルトであったことが記載されます)。

15.3.1.5 アクティビティ・タイムアウト時にBPELインスタンス監査証跡に追加されるイベント

タイムアウトしたアクティビティからbpelx:timeoutフォルトがスローされると、想定したコールバック・メッセージをパートナから受信した場合とは対照的に、アクティビティがタイムアウトしたことを示すインスタンス監査証跡にイベントが記録されます。

15.3.1.6 サーバー再起動時にリカバリ可能なタイムアウト・アクティビティ(有効期限アラーム表のリフレッシュ)

有効なタイムアウトの期間またはdatetimeを指定するアクティビティは、基礎となる作業アイテム・オブジェクトの有効期限が設定されているwaitアクティビティおよびonAlarmアクティビティとほぼ同様の方法で実装されます。スケジューラを使用してこれらのアクティビティをスケジュールしたノードが(正常な停止または中途完了のいずれかで)停止した場合は、サーバー再起動時に、スケジューラを使用してこれらのアクティビティをすべて再スケジュールする必要があります。

ノードが停止した場合、これらのアクティビティをクラスタの単一のノード(マスター・ノード)で再スケジュールすることはできません。

15.3.2 receiveアクティビティのタイムアウトの設定方法

receiveアクティビティでタイムアウトを設定する手順は、次のとおりです。

  1. SOAコンポジット・エディタで、バージョン1.1のBPELプロセス・サービス・コンポーネントをダブルクリックします。

  2. 「コンポーネント・パレット」で、「BPELコンストラクト」を展開します。

  3. receiveアクティビティをデザイナにドラッグします。

  4. アクティビティを開きます。

  5. 「タイムアウト」タブをクリックします。

    図15-7に示すように、このタブでリクエスト/レスポンス操作のタイムアウトを設定できます。

    図15-7 「タイムアウト」タブ

    図15-7の説明が続きます
    「図15-7 「タイムアウト」タブ」の説明

  6. 適切な値を指定し、「適用」をクリックします。例:

    • アクティビティの起動時からの相対的なタイムアウトを指定するには、「期間」ボタンをクリックして値を入力するか、「式」ボタンをクリックしてXPath式を指定します。

    • リクエスト/レスポンス操作の絶対的な期限としてタイムアウトを指定するには、「期限」ボタンをクリックして値を入力するか、「式」ボタンをクリックしてXPath式を指定します。

  7. 「適用」「OK」の順にクリックします。

15.3.3 receiveアクティビティのタイムアウト設定時の処理内容

.bpelファイルのコード・セグメントは、特定の操作に対する設計完了後の定義を示しています。

たとえば、アクティビティが実行開始後5分以内にインバウンド・メッセージの着信を予定していることを指定した場合は、例15-7に示すように構文が表示されます。

例15-7 静的な期間

bpelx:for="'PT5M'"/>

たとえば、アクティビティが実行開始以降、インバウンド・メッセージの着信を遅くとも2010年1月24日午前11時(UTC+1)以前に予定していることを指定した場合は、例15-8に示すような構文が表示されます。

例15-8 日時の値

bpelx:until="'2010-01-24T11:00:00-08:00'"/> 

たとえば、アクティビティの起動時からの相対的なタイムアウトの値を取得するようにXPath式を指定した場合は、例15-9に示すような構文が表示されます。

例15-9 XPath式

bpelx:for="bpws:getVariableData('inputVariable','payload','/tns:waitValue/tns:for')"/>

15.4 有効期限を設定するwaitアクティビティの作成

waitアクティビティを使用すると、プロセスは指定された期間または時間制限に達するまで待機できます。有効期限条件を1つのみ指定する必要があります。このアクティビティの典型的な用途は、一定の時間に操作を起動することです。通常は、プロセスの状態に依存する式を入力します。

待機期間を指定する場合は、次の点に注意してください。


注意:

waitアクティビティの期限切れイベントのスケジュールには、Quartzバージョン1.6がサポートされています。


15.4.1 最小待機時間の指定方法

BPELプロセスがデハイドレーションに関連して待機する最小期間を指定できます。待機期間が指定値以下の場合、BPELはアクティビティの実行を同じスレッドの同じトランザクションで続行します。

  1. 「SOAインフラストラクチャ」メニューから、「SOA管理」「BPELプロパティ」の順に選択します。

  2. 「BPELサービス・エンジン・プロパティ」ページの下部で、「詳細BPEL構成プロパティ」をクリックします。

  3. MinBPELWaitをクリックします。

  4. 「値」フィールドに値を秒単位で指定します。

  5. 「適用」をクリックします。

  6. 「戻る」をクリックします。

15.4.2 waitアクティビティの作成方法

waitアクティビティを作成する手順は、次のとおりです。

  1. 「コンポーネント・パレット」で、「BPELコンストラクト」を展開します。

  2. waitアクティビティをデザイナにドラッグします。

  3. waitアクティビティをダブルクリックし、「Wait」ダイアログを表示します。

  4. 「期間」セクションに、待機する時間を入力します。

  5. 図15-8に示すように、「期限」セクションで、待機する期限を選択します。

    図15-8 「Wait」ダイアログ

    図15-8の説明が続きます
    「図15-8 「Wait」ダイアログ」の説明

15.4.3 waitアクティビティ作成時の処理内容

BPEL 1.1では、例15-10に示すように、有効期限条件を1つのみ指定する必要があります。

例15-10 BPEL 1.1でのwaitアクティビティ

<wait (for="duration-expr" | until="deadline-expr") standard-attributes>
    standard-elements
  </wait>

例15-11に、BPEL 2.0の構文を示します。

例15-11 BPEL 2.0でのwaitアクティビティ

<wait <for>'duration-expr'</for> | <until>'duration-expr'</until>
    standard-elements
  </wait>

15.5 BPEL 2.0のOnEventブランチを使用してメッセージ着信を待機するためのイベントの指定

指定されたイベントがメッセージの到着を待機するonEventブランチをscopeアクティビティ内に作成できます。たとえば、顧客のクレジット要求メッセージによって開始されるクレジット要求プロセスがあると仮定します。さらに顧客対応を行わなくても要求は完全に処理され、結果が顧客に送信されます。ただし、顧客がクレジット要求のステータスに関する問合せ、要求内容の変更、または処理中の要求の完全な取消を行う場合があります。このような顧客対応は、ビジネス・オーダー処理の特定の時点でのみ発生するとはかぎりません。onEventブランチなどのイベント・ハンドラを使用すると、ビジネス・プロセスでは、プライマリ・ビジネス・ロジック・フローに並行して到着する要求(ステータス要求、変更要求、取消要求など)を受け入れることができます。

onEventイベント・ハンドラは、内側に囲まれているスコープと関連付けられます。onEventイベント・ハンドラはスコープが初期化されると有効になり、スコープが終了すると無効になります。有効になると、いくつものイベントが発生する可能性があります。イベントは、スコープのプライマリ・アクティビティおよびイベント相互に並行して処理されます。メッセージ・イベントも、プロセスによって公開されるサービス操作を表し、onEvent要素としてモデル化されます。イベント・ハンドラは新しいプロセス・インスタンスを作成できません。したがって、メッセージ・イベントは常に、すでにアクティブなプロセス・インスタンスで受信されます。

15.5.1 scopeアクティビティでのonEventブランチの作成方法

scopeアクティビティでonEventブランチを作成する手順は、次のとおりです。

  1. 図15-9に示すように、開いた状態のscopeアクティビティで、「OnEventの追加」をクリックします。

    図15-9 「OnEventの追加」アイコン

    図15-9の説明が続きます
    「図15-9 「OnEventの追加」アイコン」の説明

    これにより、OnEventブランチおよび内側に囲まれているscopeアクティビティが作成されます。

  2. OnEventブランチをダブルクリックします。

    図15-10に示すように、「OnEvent」ダイアログが表示されます。

    図15-10 「OnEvent」ダイアログ

    図15-10の説明が続きます
    「図15-10 「OnEvent」ダイアログ」の説明

  3. 「パートナ・リンク」フィールドで、「検索」アイコンをクリックして、メッセージが到着するエンドポイント参照を含むパートナ・リンクを選択します。

    「ポート・タイプ」フィールドおよび「操作」フィールドは、イベントを発生させるためにパートナによって呼び出されるポート・タイプおよび操作を定義します。

  4. 変数または「送信元パート」要素を使用して、パートナからメッセージを受信するための方法を指定します。

  5. 「適用」をクリックし、「OK」をクリックします。

  6. BPELプロセスの設計を続行します。

15.5.2 OnEventブランチ作成時の処理内容

例15-12に、設計完了後の.bpelファイル内のonEventブランチの概要を示します。onEventブランチは、クレジット要求のステータスの問合せ、要求内容の変更または処理中の要求の完全な取消を行います。

例15-12 onEventブランチ

<process name="creditRequestProcess" . . .>
   . . .
   <eventHandlers>
      <onEvent partnerLink="requestCreditScore"
         operation="queryCreditRequestStatus" ...>
         <scope name="scopeStatus">...</scope>
      </onEvent>
      <onEvent partnerLink="requestCreditScore"
         operation="modifyCreditRequest" ...>
         <scope name="scopeRequest">...</scope>
      </onEvent>
      <onEvent partnerLink="requestCreditScore"
         operation="cancelCreditRequest" ...>
         <scope name="scopeCancel">...</scope>
      </onEvent>
   </eventHandlers>
   . . .
</process>

15.6 永続同期プロセスに対するタイムアウトの設定

リモート・データベースに接続する永続同期プロセスについては、Oracle Enterprise Manager Fusion Middleware ControlのシステムMBeanブラウザで、SyncMaxWaitTimeタイムアウト・プロパティの値を増加する必要があります。

このプロパティの設定方法については、第7.3項「永続同期プロセスのトランザクションのタイムアウト値の指定」を参照してください。