プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle SOA SuiteでのSOAアプリケーションの開発
12c (12.1.3)
E53007-05
目次へ移動
目次

前
次

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

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

この章の内容は次のとおりです。

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 JDeveloperscopeアクティビティを開き、左側でアイコンを参照して追加するブランチを検索します。

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

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

  1. で、BPELプロセス・サービス・コンポーネントをダブルクリックします。
  2. 「コンポーネント」ウィンドウで、「BPELコンストラクト」「構造化アクティビティ」の順に選択して開きます。
  3. pickアクティビティをデザイナにドラッグします。

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

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

    図15-2の説明が続きます
    「図15-2 pickアクティビティ」の説明
  4. OnMessageブランチをクリックして、そのプロパティ・フィールドをプロパティ・インスペクタで表示するか、OnMessageブランチをダブルクリックします。

    アクティビティをプロパティ・インスペクタで編集する方法の詳細は、「BPELアクティビティをプロパティ・インスペクタで編集する方法」を参照してください。

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

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

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

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

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

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

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

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

次の例のコード・セグメントは、この操作の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における次のタイプの操作に対して、タイムアウト設定を指定できます。

  • リクエスト/リプライ(同期)操作。

  • 入力専用receive(非同期)操作。このシナリオでは、receiveアクティビティは中間プロセスのアクティビティであり、新しいインスタンスを作成する(つまり、「Receive」ダイアログの「インスタンスの作成」チェック・ボックスが選択されている)アクティビティではない必要があります。

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

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

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

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

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

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

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

次のシナリオを使用して、タイムアウトを設定します。

  • 「インスタンスの作成」チェック・ボックスを選択解除する

  • receiveアクティビティは、BPELプロセス(ほとんどの場合)の処理中である

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

  1. で、BPELプロセス・サービス・コンポーネントをダブルクリックします。
  2. 「コンポーネント」ウィンドウで、「BPELコンストラクト」を展開します。
  3. receiveアクティビティをデザイナにドラッグします。
  4. アクティビティを開きます。
  5. 「タイムアウト」タブをクリックします。

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

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

    図15-7の説明が続きます
    「図15-7 「タイムアウト」タブ」の説明
  6. 適切な値を指定し、「適用」をクリックします。次に例を示します。
    • アクティビティの起動時からの相対的なタイムアウトを指定するには、「期間」ボタンをクリックして値を入力するか、「式」ボタンをクリックしてXPath式を指定します。

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

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

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

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

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

<bpelx:for="'PT5M'"/>

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

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

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

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

15.3.3 リクエスト・リプライ操作および入力専用操作に対するタイムアウトの設定に関する必知事項

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

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

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

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

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

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

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

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

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

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

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.3.2 絶対的な日時でのタイムアウト設定

タイムアウト設定は、リクエスト/レスポンスreceiveアクティビティの絶対的な期限として指定できます。BPEL 2.0では、構文は次の例のようになります。

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

BPEL 1.1では、構文は次の例のようになります。

<receive bpelx:until="deadline-expr">
    standard-elements
</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.3.3 XPath式を使用して動的に計算されるタイムアウト設定

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

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

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

次の例に、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.3.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.3.5 アクティビティ・タイムアウト時にBPELインスタンス監査証跡に追加されるイベント

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

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

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

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

15.4 waitアクティビティによる有効期限の設定

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

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

  • 処理を必要とする他のイベントとともにスケジュールされている場合、待機期間は保証されません。この追加処理のために、実際の待機期間は、BPELプロセスに指定されている待機期間より長くなる可能性があります。

  • 2秒未満の待機期間はサーバーから無視されます。2秒以上1分未満の待機期間は、正確な指定時間で実行されないことがあります。ただし、分単位の待機期間は指定時間で実行されます。

  • 待機時間2秒のデフォルト値は、Oracle Enterprise Manager Fusion Middleware ControlのシステムMBeanブラウザのMinBPELWaitプロパティで指定されます。このプロパティは任意の値に設定でき、MinBPELWait未満の待機の遅延は無視されます。

注意:

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 2.0では、次の例に示すように、有効期限条件を1つのみ指定する必要があります。

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

次の例はBPEL 1.1構文を示しています。

<wait (for="duration-expr" | until="deadline-expr") standard-attributes>
    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ブランチ作成時の処理内容

次の例に、設計完了後の.bpelファイル内のonEventブランチの概要を示します。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タイムアウト・プロパティの値を増加する必要があります。

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

15.7 BPELプロセスにおけるOracle Enterprise Schedulerジョブの起動

Oracle Enterprise SchedulerジョブをBPELプロセスで起動できます。Oracle Enterprise Schedulerジョブは、Java、データベースのストアド・プロシージャまたは実行可能ファイルの形態における作業の単位です。ジョブ定義はOracle Enterprise Schedulerに関連付けられ、ここでジョブの実行方法を記述します。Oracle Enterprise Schedulerでは、WebサービスがジョブをBPELプロセス内から発行し、スケジュールをそのジョブ・リクエストと関連付けます。

スケジュール済Oracle Enterprise Schedulerジョブはランタイム環境に格納され、データベース・ベースのアクセスを使用して、Oracle Metadata Servicesリポジトリ(MDSリポジトリ)接続でアクセスできます。

注意:

この項では、ジョブの完了を待機する方法ではなく、BPELプロセスからのジョブの発行方法を説明します。BPELプロセスでジョブの完了を待機するには、Webサービスを起動して、ジョブの完了時にコールバックを要求し、そのコールバックを取得するために受信を実行する必要があります。詳細は、『Oracle Enterprise Schedulerアプリケーションの開発』の「Oracle Enterprise Scheduler Webサービスの使用方法」を参照してください。

15.7.1 OracleデータベースとSOA-MDSの接続を作成する方法

OracleデータベースとSOA-MDSの接続を作成するには:

  1. SOAコンポジット・アプリケーションを作成します。詳細は、「SOAアプリケーションの作成」を参照してください。

  2. BPELプロセスをSOAコンポジット・エディタで作成します(この例では、同期BPELプロセスが作成されます)。詳細は、「BPELプロセス・サービス・コンポーネントの追加方法」を参照してください。

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

    Oracle BPELデザイナが表示されます。

  4. Oracleデータベース接続を作成します。これはOracle Enterprise Schedulerジョブの問合せで必要です。

    1. 「ファイル」メイン・メニューから「新規」「アプリケーション」の順に選択します。

    2. 「カテゴリ」リストから、「接続」を選択します。

    3. 「データベース接続」を選択します。

      「データベース接続の作成」ウィザードが表示されます。

    4. Oracle Enterprise Schedulerがデプロイされているランタイム・サーバーの、スケジューラOracle Metadata Services Repositoryデータベースとの接続を作成するためのデータベース接続の作成ウィザードのダイアログを完了し、「終了」をクリックします。

  5. SOA-MDS接続を作成します。データベース・ベースのMDSリポジトリが、選択ジョブの取得で使用されます。

    1. 「ファイル」メイン・メニューから「新規」「アプリケーション」の順に選択します。

    2. 「カテゴリ」リストから、「接続」を選択します。

    3. 「SOA-MDS接続」を選択します。

      「SOA-MDS接続の作成」ダイアログが表示されます。

    4. 「接続タイプ」リストから、「DBベースMDS」を選択します。

    5. 「接続」リストで、手順4で作成されたデータベース接続が表示されることを確認してください。

    6. 「MDSパーティションの選択」リストから、Oracle Enterprise Schedulerジョブを含めるパーティションを選択します。ネイティブのホスティング・アプリケーションが事前デプロイ済のOracle Enterprise Schedulerに定義されているジョブの場合は、MDSパーティション名はessUserMetadataです。

    7. SOA-MDS接続を作成するためのダイアログの残りのフィールドを完成し、「OK」をクリックします。

15.7.2 スケジュール・ジョブ・アクティビティを作成する方法

スケジュール・ジョブ・アクティビティを作成するには:

  1. 「コンポーネント」ウィンドウで、「Oracle Extensions」を展開します。
  2. 図15-11に示すように、スケジュール・ジョブ・アクティビティをBPELプロセスにドラッグします。

    図15-11 「ジョブのスケジュール」アイコン

    図15-11の説明が続きます
    「図15-11 「ジョブのスケジュール」アイコン」の説明
  3. アクティビティをダブルクリックし、スケジュール・ジョブの編集ダイアログを起動します。図15-12に詳細を示します。このダイアログにより、アプリケーション、説明、Oracle Enterprise Schedulerジョブ、ジョブ・スケジュールおよびジョブ開始時間を指定できます。

    図15-12 スケジュール・ジョブの編集ダイアログ: 「一般」タブ

    図15-12の説明が続きます
    「図15-12 スケジュール・ジョブの編集ダイアログ: 「一般」タブ」の説明
  4. 表15-1の説明に従って、環境に適した値を指定し、「OK」をクリックします。

    表15-1 スケジュール・ジョブの編集ダイアログ: 「一般」タブ

    フィールド 説明

    アプリケーション

    選択されたジョブのSYS_effectiveApplicationプロパティの値が表示されます。このプロパティを設定する必要があります。設定されていなと、エラー・メッセージが表示され、進むことができません。

    このフィールドの編集可能状態は、選択されたジョブ定義によって異なります。

    • 選択されたジョブ定義でSYS_effectiveApplicationが用意されていると、このプロパティの値が表示され、このフィールドは編集できません。

    • ジョブ定義でSYS_effectiveApplicationが用意されていないと、このフィールドは編集でき、「システム・プロパティ」タブの「ユーザー定義プロパティ」セクションでアプリケーション名を指定する必要があります。

    名前

    ジョブの名前を指定します。

    説明

    リクエストの説明を指定します。

    ジョブ

    「検索」アイコンをクリックして、「エンタープライズ・スケジューラ・ブラウザ」ダイアログを起動し、ジョブをSOA-MDS接続から選択します。ジョブを選択すると、そのジョブ用に定義されたシステム・プロパティやアプリケーション・プロパティが、「アプリケーション・プロパティ」「システム・プロパティ」のタブに表示されます。

    スケジュール

    「検索」アイコンをクリックして、「エンタープライズ・スケジューラ・ブラウザ」ダイアログを起動し、ジョブ・スケジュールを選択します。指定しない場合、ジョブはすぐに実行されます。

    スケジュールをOracle Enterprise Manager Fusion Middleware Controlで定義します。これらのスケジュールは、「エンタープライズ・スケジューラ・ブラウザ」ダイアログの選択内容に表示されます。詳細は、『Oracle Enterprise Schedulerの管理』の事前定義済ジョブ・スケジュールの作成または編集に関する項を参照してください。

    開始時間

    「XPath式ビルダー」アイコンをクリックして、開始時間をXPath式として指定します。開始はスケジュールと別で、ジョブが有効であることを示します。開始時間を指定しない場合、開始時間は即時になります。

    終了時間

    「XPath式ビルダー」アイコンをクリックして、終了時間をXPath式として指定します。終了はスケジュールと別で、ジョブが終了する時期を示します。スケジュールを指定しない場合、このフィールドは表示されません。


  5. 「アプリケーション・プロパティ」タブをクリックします。アプリケーション・プロパティは、特定のジョブに固有です。Oracle Enterprise Schedulerジョブをスケジュール・ジョブの編集ダイアログの「一般」タブで選択すると、ジョブで定義されたアプリケーション・プロパティがこのダイアログに表示されます。また、「ユーザー定義プロパティ」セクションで独自のアプリケーション・プロパティを指定できます。図15-13に詳細を示します。

    図15-13 スケジュール・ジョブの編集ダイアログ: 「アプリケーション・プロパティ」タブ

    図15-13の説明が続きます
    「図15-13 スケジュール・ジョブの編集ダイアログ: 「アプリケーション・プロパティ」タブ」の説明
  6. 表15-2の説明に従って、環境に適した値を指定し、「OK」をクリックします。

    表15-2 スケジュール・ジョブの編集ダイアログ: 「アプリケーション・プロパティ」タブ

    フィールド 説明

    ジョブ・プロパティ

    ジョブで定義したアプリケーション・プロパティが表示されます。値のみ変更できます。この表のプロパティは削除できません。プロパティをダブルクリックしてその値を編集するか、「値」フィールドの右側で「参照」アイコンをクリックして、XPath式を指定します。

    ユーザー定義プロパティ

    このリクエストで追加されたアプリケーション・プロパティが表示されます。この表にあるプロパティの追加、変更または削除ができます。


  7. 「システム・プロパティ」タブをクリックします。システム・プロパティは、Oracle Enterprise Schedulerによって予約された名前を持つパラメータです。Oracle Enterprise Schedulerでは、SystemPropertyクラスで、システムによって認識され使用されるパラメータ名を表します。Oracle Enterprise Schedulerジョブをスケジュール・ジョブの編集ダイアログの「一般」タブで選択すると、ジョブで定義されたシステム・プロパティがこのダイアログに表示されます。また、「ユーザー定義プロパティ」セクションで独自のシステム・プロパティを指定できます。図15-14に詳細を示します。

    図15-14 スケジュール・ジョブの編集ダイアログ: 「システム・プロパティ」タブ

    図15-14の説明が続きます
    「図15-14 スケジュール・ジョブの編集ダイアログ: 「システム・プロパティ」タブ」の説明

    システム・プロパティの詳細は、『Oracle Enterprise Schedulerアプリケーションの開発』の「パラメータとシステム・プロパティの使用方法」を参照してください。

  8. 表15-3の説明に従って、環境に適した値を指定し、「OK」をクリックして、構成を完成させます。

    表15-3 スケジュール・ジョブの編集ダイアログ: 「システム・プロパティ」タブ

    フィールド 説明

    ジョブ・プロパティ

    ジョブで定義したシステム・プロパティが表示されます。値のみ変更できます。プロパティをダブルクリックしてその値を編集するか、「参照」アイコンをクリックして、XPath式を「式ビルダー」ダイアログで指定します。

    ユーザー定義プロパティ

    このリクエストで追加されたシステム・プロパティが表示されます。この表にあるプロパティの追加、変更または削除ができます。この表にあるシステム・プロパティ名の固定リストから選択します。


    図15-15に示されるメッセージが表示されます。Oracle Enterprise SchedulerのWebサービスに抽象的なWSDLが含まれているためです。

    BPELプロセスでは次が必要です。

    • 具体WSDL

    • パートナ・リンクのあるWSDL

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

    具体ラッパーWSDLが抽象的なWSDL用に作成されます。ラッパーWSDLには、BPELプロセスに追加されているOracle Enterprise Schedulerパートナ・リンクが含まれています。

  10. スケジュール・ジョブ・アクティビティをBPELプロセスで展開して、その内容を表示します。図15-16に詳細を示します。

    図15-16 BPELプロセスにおけるジョブ・スケジュール・アクティビティの展開

    図15-16の説明が続きます
    「図15-16 BPELプロセスにおけるジョブ・スケジュール・アクティビティの展開」の説明

    展開されたスケジュール・ジョブ・アクティビティは、自動的に構成された次のアクティビティで構成されています。

    • EssAssignアクティビティ: システム・プロパティやアプリケーション・プロパティなどのジョブ情報のコピー・ルール操作が格納されます。

    • EssInvokeアクティビティ: Oracle Enterprise Schedulerパートナ・リンクを起動します。

    • EssServiceアクティビティ: Oracle Enterprise Scheduler Webサービス・パートナ・リンクが含まれています。

  11. SOAコンポジット・エディタでSOAコンポジット・アプリケーションに移動します。
  12. 「外部参照」スイムレーンで、「EssService」パートナ・リンクをダブルクリックします。

    「参照の更新」ダイアログが表示されます。

  13. 「WSDL URL」フィールドで、参照バインディング・コンポーネントの具体WSDLを指定して、「OK」をクリックします。

15.7.3 セキュリティ・ポリシーをサービス・バインディング・コンポーネントと参照バインディング・コンポーネントにアタッチする方法

セキュリティ・ポリシーをサービス・バインディング・コンポーネントと参照バインディング・コンポーネントにアタッチするには:

  1. 「EssService」参照バインディング・コンポーネントを右クリックし、「SOA WSポリシーの構成」「リクエスト対象」を選択します。

    「SOA WSポリシーの構成」ダイアログが表示されます。

  2. 「セキュリティ」セクションで「追加」アイコンをクリックします。
  3. 「oracle/wss_username_token_client_policy」を選択し、「OK」をクリックします。
  4. 「SOA WSポリシーの構成」ダイアログで「OK」をクリックします。
  5. サービス・バインディング・コンポーネントを右クリックし、「SOA WSポリシーの構成」を選択します。

    「SOA WSポリシーの構成」ダイアログが表示されます。

  6. 「セキュリティ」セクションで「追加」アイコンをクリックします。
  7. 「oracle/wss_username_token_service_policy」を選択して「OK」をクリックします。

    これで、設計は完了します。

    注意:

    Oracle Enterprise SchedulerのWebサービスは、デフォルトでは保護されていません。WebサービスでBPELプロセスからジョブを発行する前に、WLSTコマンドまたはOracle Enterprise Manager Fusion Middleware ControlでOracle Web Services Managerポリシーを使用して、最初に保護する必要があります。