ヘッダーをスキップ
Oracle Fusion Middleware Oracle SOA Suite開発者ガイド
11g リリース1(11.1.1)
B56238-02
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

39 ビジネス・イベントおよびイベント配信ネットワークの使用

この章では、SOAコンポジット・アプリケーションでビジネス・イベントを公開し、サブスクライブする方法を説明します。ビジネス・イベントは、ビジネス環境で発生した結果として送信されるメッセージ・データから構成されます。ビジネス・イベントが公開されると、他のサービス・コンポーネントはそれをサブスクライブできます。

項目は次のとおりです。

Oracle Mediatorでビジネス・イベントを使用する方法を示したサンプルは、次のURLを参照してください。

https://soasamples.samplecode.oracle.com/#mediator

39.1 ビジネス・イベントの概要

目的の状況が発生した場合は、ビジネス・イベントを発生させることができます。たとえば、融資フロー・シナリオにおいて、融資プロセスを実行するBPELプロセス・サービス・コンポーネントは、プロセスの完了時に融資完了イベントを発生させることができます。このアプリケーションのインフラストラクチャの範囲内で、他のシステムはこれらのイベントをリスニングし、イベントの受信時に次の処理を実行できます。

ビジネス・イベントは通常、一方向(fire-and-forget)、非同期方式でビジネス発生の通知を送信します。ビジネス・プロセスには、次のような特徴があります。

これらは、Web Services Description Language(WSDL)ファイル規定に依存する直接サービス起動(Simple Object Access Protocolサービス・クライアントなど)とビジネス・イベントの重要な相違点です。イベントの発生がイベントの受信者に依存する場合、メッセージは通常、ビジネス・イベントではなくサービス起動を通して配信する必要があります。直接サービス起動とは異なり、ビジネス・イベントはサーバーからクライアントを分離します。

ビジネス・イベントは、イベント定義言語(EDL)を使用して定義されます。EDLは、ビジネス・イベント定義の作成に使用するスキーマです。アプリケーションは、ビジネス・イベント定義のインスタンスと協調して動作します。

EDLの構成内容は次のとおりです。

例39-1に、BugReportイベント定義内に2つのビジネス・イベントbugUpdatedおよびbugCreatedがあるEDLファイルを示します。ネームスペース(BugReport)および関連するスキーマ・ファイル(BugReport.xsd)が参照されます。

例39-1 2つのビジネス・イベントがあるEDLファイル

<?xml version = '1.0' encoding = 'UTF-8'?>
<definitions targetNamespace="/model/events/edl/BugReport"
 xmlns:ns0="/model/events/schema/BugReport"
 xmlns="http://schemas.oracle.com/events/edl">
   <schema-import namespace="/model/events/schema/BugReport"
 location="BugReport.xsd"/>

   <event-definition name="bugCreated">
      <content element="ns0:bugCreatedInfo"/>
   </event-definition>

   <event-definition name="bugUpdated">
      <content element="ns0:bugUpdatedInfo"/>
   </event-definition>
</definitions>

これら2つのイベントはOracle Mediatorのサブスクリプションで使用できます。

ビジネス・イベントは、メタデータ・サービス(MDS)リポジトリにデプロイされます。ビジネス・イベントをそのアーチファクト(XSDなど)とともにMDSにデプロイすることを、EDL(またはイベント定義)の公開とも呼びます。このアクションにより、EDLおよびそのアーチファクトがMDS内の共有領域に転送されます。MDS共有領域内のオブジェクトは、Oracle JDeveloperのリソース・パレット内のすべてのアプリケーションで参照できます。公開されたEDLは、他のアプリケーションでサブスクライブできます。EDLの公開を解除することはできません。定義は常に存在します。

サブスクリプションは、特定の修飾名(QName)(x.y.z/newOrdersなど)に対して行います。QNameはタプル(URIlocalName)であり、xmlns:prefix=URIなどのネームスペース宣言またはネームスペース・コンテキストとの組合せで、文字列prefix:localNameから導出できます。また、コンテンツ・ベースのフィルタを使用すると、サブスクリプションをさらに絞り込むことができます。

ビジネス・イベントは、イベント配信ネットワーク(EDN)内で公開されます。EDNは、すべてのSOAインスタンスの範囲内で実行されます。発生したイベントはEDNにより、サブスクライブするサービス・コンポーネントに配信されます。Oracle Mediatorサービス・コンポーネントとBPELプロセス・サービス・コンポーネントはイベントをサブスクライブし、公開できます。

EDNには、次の2つの異なる実装があります。

Oracleデータベースを使用している場合は、EDN-JMSではなくEDN-DBを使用することをお薦めします。

39.1.1 ローカルおよびリモートのイベント境界

1つのSOAコンポジット・アプリケーション・インスタンスは、1つのコンテナ内に配置することも、複数のコンテナにわたってクラスタ化することもできます。別のアプリケーション(Oracle Application Development Framework(ADF)Business Componentアプリケーションなど)を構成し、SOAコンポジット・アプリケーション・インスタンスと同じコンテナ内または異なるコンテナ内で実行できます。

ローカル・イベント接続またはリモート・イベント接続を通して、Java EEアプリケーションからイベントを発生させることができます。

  • ローカル・イベント接続

    パブリッシャがアプリケーションと同じOracle WebLogic Serverに存在し、パブリッシャがローカル・ビジネス・イベント接続ファクトリを使用する場合、イベントはローカル・イベント接続を通して発生します。このシナリオでは、同期サブスクリプションが同期して実行されます。

  • リモート・イベント接続

    コール元がアプリケーションと異なるコンテナ(異なるJVM)内に存在する場合、イベントはリモート・イベント接続を通して発生します。リモート・イベント接続では、非同期サブスクリプションのみがサポートされます。

PL/SQL APIを通してイベントを発生させることもできます。

別のアプリケーション(Oracle ADF Business Componentアプリケーションなど)を構成し、SOAコンポジット・アプリケーションと同じコンテナ内で実行すると、このアプリケーションはローカル・イベント接続を使用するように最適化されます。イベントの境界は、アプリケーション・インスタンスです。イベントがアプリケーション・インスタンス内で発生すると、アプリケーション・インスタンスに登録されたサブスクリプションが実行されます。イベントは、1つのアプリケーション・インスタンスから別のインスタンスに伝播されません。伝播は、イベントをリスニングし、イベントをJMSキューに公開するOracle Mediatorを通して、両方のインスタンスで可能になります。

39.2 Oracle Jdeveloperでのビジネス・イベントの作成

この項では、ビジネス・イベントの作成方法およびサブスクライブ方法の高レベルな概要が提供されます。このシナリオでは、ストアフロント・アプリケーション(StoreFrontServiceサービス)でユーザーから注文を受けたときに、NewOrderSubmittedというビジネス・イベントが作成されます。その後、このビジネス・イベントをサブスクライブするOracle Mediatorサービス・コンポーネントを作成します。

39.2.1 ビジネス・イベントの作成方法

ビジネス・イベントを作成する手順は、次のとおりです。

  1. SOAプロジェクトを空のコンポジットとして作成します。

  2. 次の2つの方法のいずれかにより、イベント定義の作成ウィザードを起動します。

    1. SOAコンポジット・エディタで、デザイナの上のアイコンをクリックします。図39-1に例を示します。

      図39-1 「イベント定義の作成」

      図39-1の説明は次にあります。
      「図39-1 「イベント定義の作成」」の説明

    2. 「ファイル」メイン・メニューから、「新規」「SOA層」「サービス・コンポーネント」「イベント定義」の順に選択します。

    「イベント定義の作成」ダイアログが表示されます。

  3. 表39-1に記載されている詳細を入力します。

    表39-1 イベント定義の作成ウィザードのフィールドと値

    フィールド

    イベント定義名

    名前を入力します。

    注意: イベント名としてスラッシュ(/)を入力しないでください。スラッシュを入力すると、名前が拡張子のみのイベント定義ファイル(.edn)が作成されます。

    ディレクトリ

    ディレクトリ・パスが表示されます。

    ネームスペース

    デフォルトのネームスペースをそのまま使用するか、イベントを配置するネームスペースに対する値を入力します。


  4. 「追加」アイコンをクリックして、イベントを追加します。

    「イベントの追加」ダイアログが表示されます。

  5. 「検索」アイコンをクリックしてペイロードを選択し、「OK」をクリックします。図39-2に詳細を示します。

    図39-2 ペイロードの選択

    図39-2の説明は次にあります。
    「図39-2 ペイロードの選択」の説明

  6. 図39-3に示すように、「名前」フィールドに名前を入力します。

    図39-3 「イベントの追加」ダイアログ

    図39-3の説明は次にあります。
    「図39-3 「イベントの追加」ダイアログ」の説明

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

    図39-4に示すように、追加したイベントが「イベント」セクションに表示されます。

    図39-4 「イベント定義の作成」ダイアログ

    図39-4の説明は次にあります。
    「図39-4 「イベント定義の作成」ダイアログ」の説明

  8. エディタの上部にある、event_definition_name.edlの横のxアイコンをクリックして、イベント・エディタを閉じます。

  9. 変更を保存するように求められた場合は、「はい」をクリックします。変更を保存しないとイベントは作成されず、「イベント・チューザ」ウィンドウでは選択できません。

    ビジネス・イベントがMDSに公開され、SOAコンポジット・エディタに戻ります。「リソース・パレット」に、ビジネス・イベントが表示され参照できます。

39.3 Oracle Mediatorサービス・コンポーネントからのビジネス・イベントのサブスクライブまたは公開

この項では、Oracle Mediatorサービス・コンポーネントからビジネス・イベントをサブスクライブまたは公開する方法について説明します。

39.3.1 ビジネス・イベントをサブスクライブする方法

ビジネス・イベントをサブスクライブする手順は、次のとおりです。

  1. 「コンポーネント・パレット」からSOAコンポジット・エディタに、メディエータ・サービス・コンポーネントをドラッグします。このサービス・コンポーネントにより、ビジネス・イベントをサブスクライブできます。

  2. 「名前」フィールドに、名前を入力します。

  3. 「オプション」リストから、「イベントのサブスクライブ」を選択します。

    ウィンドウがリフレッシュされ、イベント表が表示されます。

  4. 「追加」アイコンをクリックして、イベントを選択します。

    「イベント・チューザ」ウィンドウが表示されます。

  5. 作成したイベントを選択し、「OK」をクリックします。

    「メディエータの作成」ダイアログが再び表示されます。

  6. イベントと一貫性がある配信のレベルを選択します。

    • 唯一

      イベントは、それ自体のグローバル(つまりJTA)トランザクションのサブスクライバに配信されます。イベント処理が完了すると、そのトランザクション内でサブスクライバが行ったあらゆる変更がコミットされます。サブスクライバが失敗すると、トランザクションはロールバックされます。失敗したイベントは、設定された回数だけ再試行されます。

    • 保証付き

      イベントは、グローバル・トランザクションなしでサブスクライバに非同期で配信されます。サブスクライバは、独自のローカル・トランザクションを作成して処理できますが、そのトランザクションは、残りのイベント処理とは別にコミットされます。イベントはサブスクライバに渡されることが保証されていますが、グローバル・トランザクションがないため、システムの障害が原因でイベントが2回以上配信される可能性があります。サブスクライバが例外をスローすると(または失敗すると)、例外は記録されますが、イベントは再送信されません。

    • 即時

      イベントは、パブリッシャと同じグローバル・トランザクションとスレッドで、サブスクライバに配信されます。すべての即時サブスクライバが処理を完了するまで、公開コールは返されません。いずれかのサブスクライバが例外をスローすると、追加のサブスクライバは起動されず、例外はパブリッシャにスローされます。即時処理中にエラーが発生した場合、トランザクションはロールバックされます。

  7. イベントをフィルタリングするには、選択したイベントの「フィルタ」列をダブルクリックするか、またはイベントを選択して、表の上の「フィルタ」アイコン(最初のアイコン)をクリックします。これにより「式ビルダー」ダイアログが表示されます。このダイアログで、XPathフィルタ式を指定できます。フィルタ式では、サービスの起動前にメッセージのコンテンツ(ペイロードまたはヘッダー)が分析されるように指定します。たとえば、メッセージに顧客IDが含まれている場合のみサービスを起動することを指定するフィルタ式を適用できます。

    式のロジックが満たされると、イベントの配信が可能になります。

    フィルタの詳細は、第20.2.2.7項「メッセージをフィルタリングする式の指定方法」を参照してください。

    図39-5は、「メディエータの作成」ダイアログを示しています。

    図39-5 「メディエータの作成」ダイアログ

    図39-5の説明は次にあります。
    「図39-5 「メディエータの作成」ダイアログ」の説明

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

    図39-6に、イベント・サブスクリプションのためにOracle Mediatorが構成されたことを示す左側のアイコンを示します。

    図39-6 イベント・サブスクリプションの構成

    図39-6の説明は次にあります。
    「図39-6 イベント・サブスクリプションの構成」の説明

39.3.2 ビジネス・イベントの作成およびサブスクライブ時の処理内容

例39-2のソース・コードに、Oracle Mediatorサービス・コンポーネントのサブスクライブするイベントに関する詳細を示します。

例39-2 サブスクライブするイベント

<component name="OrderPendingEvent">
    <implementation.mediator src="OrderPendingEvent.mplan"/>
    <business-events>
      <subscribe
         xmlns:sub1="/oracle/fodemo/storefront/entities/events/edl/OrderEO"
         name="sub1:NewOrderSubmitted" consistency="oneAndOnlyOne"
         runAsRoles="$publisher"/>
</business-events>
</component>

この例では具体的に明示されていませんが、イベントのXPathフィルタを定義できます。例39-3では、頭金が50000を超える場合にのみ、イベントの配信が可能になります。

例39-3 イベントに対するXPathフィルタの定義

    <business-events>
        . . .
        . . .
        <filter>
            <xpath xmlns:be="http://oracle.com/fabric/businessEvent"
                 xmlns:ns1="http://xmlns.oracle.com/singleString"
                   <xpath expression= "/be:business-event/be:content/
                   sub1:AccountInfo/Details[@initialDeposit > 50000]" />
        </filter>
      . . .
      . . .
    </business-events>

39.3.3 ビジネス・イベントのサブスクライブに関する注意事項

SOAコンポジット・アプリケーションのデフォルト以外のリビジョンに存在するサブスクライバでも、ビジネス・イベントを取得できることに注意してください。たとえば、次の動作に注意してください。

  1. M1という最初のOracle Mediatorサービス・コンポーネントとM2という2番目のOracle Mediatorサービス・コンポーネントを含む、コンポジット・アプリケーションを作成します。M1はイベントを公開し、M2はイベントをサブスクライブします。出力はディレクトリに書き込まれます。

  2. コンポジット・アプリケーションをリビジョン1としてデプロイします。

  3. コンポジット・アプリケーションを変更して、M3という3番目のOracle Mediatorサービス・コンポーネントを追加します。M3は、同じイベントをサブスクライブし、別のディレクトリに出力を書き込みます。

  4. コンポジット・アプリケーションをリビジョン2(デフォルト)としてデプロイします。

  5. リビジョン2のコンポジット・アプリケーションを起動します。

    Oracle Mediator M2は、同じ内容の出力をディレクトリ内の2つのファイルに書き込むことに注意してください。Oracle Mediator M3は、予想どおりに、イベントを取得し、別のディレクトリに出力を正常に書き込みます。しかし、(リビジョン1の)Oracle Mediator M2も、コンポジット・アプリケーションのリビジョン2から公開されたイベントを取得し、処理しています。したがって、同じディレクトリ内にもう1つ出力ファイルが作成されます。

39.3.4 ビジネス・イベントを公開する方法

第39.3.1項「ビジネス・イベントをサブスクライブする方法」でサブスクライブしたイベントを公開するための、2番目のOracle Mediatorを作成できます。

ビジネス・イベントを公開する手順は、次のとおりです。

  1. 最初のOracle Mediatorがサブスクライブしたイベントを公開する、2番目のOracle Mediatorサービス・コンポーネントを作成します。

  2. 最初のOracle Mediatorサービス・コンポーネントに戻ります。

  3. 「ルーティング・ルール」セクションで、「追加」アイコンをクリックします。

  4. 「ターゲット・タイプ」ウィンドウでプロンプトが表示されたら、「サービス」をクリックします。

  5. 2番目のOracle Mediatorサービス・コンポーネントを選択します。

  6. 「ファイル」メイン・メニューから「すべて保存」を選択します。

39.3.5 ビジネス・イベント公開時の処理内容

例39-4には、2つのOracle Mediatorサービス・コンポーネントが示されていることに注意してください。1つのサービス・コンポーネント(OrderPendingEvent)はイベントをサブスクライブし、もう1つのサービス・コンポーネント(PublishOrderPendingEvent)はイベントを公開します。

例39-4 イベントのサブスクリプションと公開

<component name="PublishOrderPendingEvent">
    <implementation.mediator src="PublishOrderPendingEvent.mplan"/>
    <business-events>
      <publishes xmlns:sub1="/oracle/fodemo/storefront/entities/events/edl/OrderEO"
 name="pub1:NewOrderSubmitted"/>
    </business-events>
  </component>

<component name="OrderPendingEvent">
    <implementation.mediator src="OrderPendingEvent.mplan"/>
    <business-events>
      <subscribe
         xmlns:sub1="/oracle/fodemo/storefront/entities/events/edl/OrderEO"
         name="sub1:NewOrderSubmitted" consistency="oneAndOnlyOne"
         runAsRoles="$publisher"/>
</business-events>
</component>

39.4 BPELプロセス・サービス・コンポーネントからのビジネス・イベントのサブスクライブまたは公開

この項のトピックは、次のとおりです。

39.4.1 ビジネス・イベントをサブスクライブする方法

ビジネス・イベントをサブスクライブする手順は、次のとおりです。

  1. 「コンポーネント・パレット」からSOAコンポジット・エディタにBPELプロセス・サービス・コンポーネントをドラッグします。

  2. 「名前」フィールドに、名前を入力します。他のデフォルトの選択は変更せずに、「OK」をクリックします。

    BPELプロセス・サービス・コンポーネントが作成されます。

  3. BPELプロセス・サービス・コンポーネントをダブルクリックします。Oracle BPELデザイナが開きます。または、BPELプロセス・サービス・コンポーネントを右クリックして「編集」をクリックすることもできます。

  4. 「コンポーネント・パレット」からSOAコンポジット・エディタのreceiveInputアクティビティの下に、receiveアクティビティをドラッグします。


    注意:

    pickアクティビティのonMessageノードを設定して、EDNからイベントを受信することもできます。onMessageノードの詳細は、第5.4項「タイムアウト付き非同期相互作用の概要」を参照してください。

  5. receiveアクティビティをダブルクリックします。図39-7に示すように、「Receive」ダイアログが開きます。または、receiveアクティビティを右クリックして「編集」をクリックすることもできます。

    図39-7 「Receive」ダイアログ

    Receive dialog in the SOA Composite Editor
    「図39-7 「Receive」ダイアログ」の説明

  6. 「名前」フィールドに、名前を入力します。

  7. 「相互作用タイプ」リストで「イベント」を選択します。図39-8に示すように、「Receive」ダイアログのレイアウトが変更されます。

    図39-8 相互作用パターンが「イベント」に設定された「Receive」ダイアログ

    Receive dialog where the interaction pattern is set to Event
    「図39-8 相互作用パターンが「イベント」に設定された「Receive」ダイアログ」の説明

  8. 「イベント」フィールドの右側にある「イベントの参照...」アイコンをクリックします。図39-9に示すように、「サブスクライブ済イベント」ダイアログが表示されます。

    図39-9 「サブスクライブ済イベント」ダイアログ

    Subscribed Events dialog
    「図39-9 「サブスクライブ済イベント」ダイアログ」の説明

  9. 「追加」アイコンをクリックして、イベントを選択します。

    図39-10に示すように、「イベント・チューザ」ダイアログが表示されます。

    図39-10 「イベント・チューザ」ダイアログ

    Event Chooser dialog
    「図39-10 「イベント・チューザ」ダイアログ」の説明

  10. 作成したイベントを選択し、「OK」をクリックします。

    「サブスクライブ済イベント」ダイアログが再び表示されます。

  11. イベントと一貫性がある配信のレベルを選択します。

    • 唯一

      イベントは、それ自体のグローバル(つまりJTA)トランザクションのサブスクライバに配信されます。イベント処理が完了すると、そのトランザクション内でサブスクライバが行ったあらゆる変更がコミットされます。サブスクライバが失敗すると、トランザクションはロールバックされます。失敗したイベントは、設定された回数だけ再試行されます。

    • 保証付き

      イベントは、グローバル・トランザクションなしでサブスクライバに非同期で配信されます。サブスクライバは、独自のローカル・トランザクションを作成して処理できますが、そのトランザクションは、残りのイベント処理とは別にコミットされます。イベントはサブスクライバに渡されることが保証されていますが、グローバル・トランザクションがないため、システムの障害が原因でイベントが2回以上配信される可能性があります。サブスクライバが例外をスローすると(または失敗すると)、例外は記録されますが、イベントは再送信されません。

    • 即時

      イベントは、パブリッシャと同じグローバル・トランザクションとスレッドで、サブスクライバに配信されます。すべての即時サブスクライバが処理を完了するまで、公開コールは返されません。いずれかのサブスクライバが例外をスローすると、追加のサブスクライバは起動されず、例外はパブリッシャにスローされます。即時処理中にエラーが発生した場合、トランザクションはロールバックされます。

  12. イベントをフィルタリングするには、選択したイベントの「フィルタ」列をダブルクリックするか、またはイベントを選択して、表の上の「フィルタ」アイコン(最初のアイコン)をクリックします。これにより「式ビルダー」ダイアログが表示されます。このダイアログで、XPathフィルタ式を指定できます。フィルタ式では、サービスの起動前にメッセージのコンテンツ(ペイロードまたはヘッダー)が分析されるように指定します。たとえば、注文に注文IDが含まれている場合のみサービスを起動することを指定するフィルタ式を適用できます。

    式のロジックが満たされると、イベントの配信が可能になります。

  13. 「OK」をクリックして「サブスクライブ済イベント」ダイアログを閉じます。「Receive」ダイアログが再び表示されます。


    注意:

    このreceiveアクティビティがBPELプロセス・サービス・コンポーネント・インスタンスを起動する起動receiveアクティビティの場合は、必要に応じて「インスタンスの作成」チェック・ボックスを選択できます。この操作によって、すべての起動に対して新しいBPELプロセス・サービス・コンポーネント・インスタンスを作成できます。

    このreceiveアクティビティが中間プロセスのreceiveアクティビティで、BPELインスタンスがすでに起動されている場合、このreceiveアクティビティは、そのBPELインスタンスの実行を続行するために、別のイベントを待機します。


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

    図39-6に、イベント・サブスクリプション用に構成されたBPELプロセス・サービス・コンポーネントを示します。

    図39-11 イベント・サブスクリプション用のBPELプロセス・サービス・コンポーネントの構成

    Description of Figure 39-11 follows
    「図39-11 イベント・サブスクリプション用のBPELプロセス・サービス・コンポーネントの構成」の説明

39.4.2 ビジネス・イベントを公開する方法

ビジネス・イベントを公開する手順は、次のとおりです。

  1. 「コンポーネント・パレット」からSOAコンポジット・エディタのreceiveアクティビティ(第39.4.1項「ビジネス・イベントをサブスクライブする方法」で作成したアクティビティ)の下に、invokeアクティビティをドラッグします。

  2. invokeアクティビティをダブルクリックします。図39-12に示すように、「Invoke」ダイアログが開きます。または、invokeアクティビティを右クリックして「編集」をクリックすることもできます。

    図39-12 「Invoke」ダイアログ

    Invoke dialog for an invoke activity
    「図39-12 「Invoke」ダイアログ」の説明

  3. 「名前」フィールドに、名前を入力します。

  4. 「相互作用タイプ」リストで「イベント」を選択します。図39-13に示すように、「Invoke」ダイアログのレイアウトが変更されます。

    図39-13 相互作用パターンが「イベント」に設定された「Invoke」ダイアログ

    Invoke dialog with interaction pattern set to event
    「図39-13 相互作用パターンが「イベント」に設定された「Invoke」ダイアログ」の説明

  5. 「イベント」フィールドの右側にある「イベントの参照...」アイコンをクリックします。「イベント・チューザ」ウィンドウが表示されます。

  6. 作成したイベントを選択し、「OK」をクリックします。

    「Invoke」ダイアログが再び表示されます。

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

    図39-14に、イベント・サブスクリプションおよび公開用に構成されたBPELプロセス・サービス・コンポーネントを示します。

    図39-14 イベント・サブスクリプションおよび公開用のBPELプロセス・サービス・コンポーネントの構成

    Description of Figure 39-14 follows
    「図39-14 イベント・サブスクリプションおよび公開用のBPELプロセス・サービス・コンポーネントの構成」の説明

39.4.3 ビジネス・イベントのサブスクライブおよび公開時の処理内容

例39-2のソース・コードに、BPELプロセス・サービス・コンポーネントのサブスクライブおよび公開するイベントに関するcomposite.xmlソース変更の様子を示します。

例39-5 イベントのサブスクリプションと公開

<component name="EventBPELProcess">
   <implementation.bpel src="EventBPELProcess.bpel"/>
   <property name="configuration.monitorLocation" type="xs:string"
             many="false">EventBPELProcess.monitor</property>
   <business-events>
     <subscribe xmlns:sub1="http://mycompany.com/events/orders"
                name="sub1:OrderReceivedEvent" consistency="oneAndOnlyOne"
                runAsRoles="$publisher"/>
     <publishes xmlns:pub1="http://mycompany.com/events/orders"
                name="pub1:ProductSoldAlert"/>
   </business-events>
</component>

この例では具体的に明示されていませんが、イベントのXPathフィルタを定義できます。例39-6では、頭金が50000を超える場合にのみ、イベントの配信が可能になります。

例39-6 イベントに対するXPathフィルタの定義

    <business-events>
        . . .
        . . .
        <filter>
            <xpath xmlns:be="http://oracle.com/fabric/businessEvent"
                 xmlns:ns1="http://xmlns.oracle.com/singleString"
                   <xpath expression= "/be:business-event/be:content/
                   sub1:AccountInfo/Details[@initialDeposit > 50000]" />
        </filter>
      . . .
      . . .
    </business-events>

特別な属性のbpelx:eventNameを使用すると、receiveinvokeおよびonMessageなどの標準BPELアクティビティが拡張されるため、BPELプロセス・サービス・コンポーネントでEDNイベント・バスからのイベントを受信できます。例39-7に、eventName属性のスキーマを示します。

例39-7 Eventname属性のスキーマ

<xs:attribute name="eventName" type="xs:QName">
        <xs:annotation>
            <xs:appinfo>
                <tns:parent>
                    <bpel11:onMessage/>
                    <bpel11:receive/>
                    <bpel11:invoke/>
                </tns:parent>
            </xs:appinfo>
        </xs:annotation>
    </xs:attribute>

例39-8に、BPELソース・ファイルでのeventName属性の使用方法を示します。

例39-8 eventName属性を使用したBPELソース・コード

<receive name="OrderPendingEvent" createInstance="yes"
         bpelx:eventName="ns1:OrderReceivedEvent"/>
<invoke name="Invoke_1" bpelx:eventName="ns1:ProductSoldAlert"/>

bpelx:eventName属性をreceiveinvokeまたはonMessage要素で使用した場合、partnerLinkoperationまたはportType属性などの標準属性は存在しません。これは、bpelx:eventName属性の存在が、このアクティビティがEDNイベント・バスからのイベントの受信またはEDNイベント・バスへのイベントの公開のみを対象としていることを表しているためです。

BPELプロセス・サービス・コンポーネントのXSDファイルは若干変更され、partnerLinkoperationおよびportTyp属性は必須ではなくなりました。bpelx:eventName属性、またはpartnerLinkoperationおよびportTyp属性(どちらか一方)の存在については、JDeveloperで検証ロジックを実施する必要があります。例39-9に、BPELのreceiveアクティビティの変更されたスキーマ定義を示します。

例39-9 BPELのreceiveアクティビティのスキーマ定義

<complexType name="tReceive">
        <complexContent>
           <extension base="bpws:tExtensibleElements">
                <sequence>
                    <element name="correlations" type="bpws:tCorrelations" minOccurs="0"/>
                    <group ref="bpws:activity"/>
                </sequence>
                <!- BPEL mandatory attributes relaxed to optional for supporting BPEL-EDN ->
                <attribute name="partnerLink" type="NCName" use="optional"/>
                <attribute name="portType" type="QName" use="optional"/>
                <attribute name="operation" type="NCName" use="optional"/>
                <attribute name="variable" type="NCName" use="optional"/>
            </extension>
        </complexContent>
    </complexType>

invokeおよびonMessageアクティビティのスキーマ定義も同様に変更されています。

39.5 ビジネス・イベントのサブスクライブに関する注意事項

SOAコンポジット・アプリケーションのデフォルト以外のリビジョンに存在するサブスクライバでも、ビジネス・イベントを取得できることに注意してください。たとえば、次の動作に注意してください。

  1. S1という最初のMediatorサービス・コンポーネントまたはBPELプロセス・サービス・コンポーネントと、S2という2番目のMediatorサービス・コンポーネントまたはBPELプロセス・サービス・コンポーネントを含む、コンポジット・アプリケーションを作成します。S1はイベントを公開し、S2はイベントをサブスクライブします。出力はディレクトリに書き込まれます。

  2. コンポジット・アプリケーションをリビジョン1としてデプロイします。

  3. コンポジット・アプリケーションを変更して、S3という3番目のMediatorサービス・コンポーネントまたはBPELプロセス・サービス・コンポーネントを追加します。S3は、同じイベントをサブスクライブし、別のディレクトリに出力を書き込みます。

  4. コンポジット・アプリケーションをリビジョン2(デフォルト)としてデプロイします。

  5. リビジョン2のコンポジット・アプリケーションを起動します。

サービス・コンポーネントS2は、同じ内容の出力をディレクトリ内の2つのファイルに書き込むことに注意してください。サービス・コンポーネントS3は、予想どおりに、イベントを取得し、別のディレクトリに出力を正常に書き込みます。しかし、(リビジョン1の)サービス・コンポーネントS2も、コンポジット・アプリケーションのリビジョン2から公開されたイベントを取得し、処理しています。したがって、同じディレクトリ内にもう1つ出力ファイルが作成されます。

39.6 Oracle ADF Business Componentビジネス・イベントをOracle Mediatorに統合する方法

この項では、Oracle ADF Business Componentイベント条件をSOAコンポーネントに統合する方法に関する高レベルな概要が提供されます。SOAコンポーネントには、Mediatorサービス・コンポーネントとBPELプロセス・サービス・コンポーネントが含まれています。

Oracle ADF Business Componentのビジネス・イベントをSOAコンポーネントに統合する手順は、次のとおりです。

  1. ビジネス・コンポーネント・プロジェクトを作成します。

  2. ビジネス・イベント定義をプロジェクトに追加します。このアクションにより、EDLファイルおよびXSDファイルが生成されます。XSDファイルにはペイロードの定義が含まれます。また、作成時には、Oracle ADF Business Componentによってイベントが発生するように必ず指定します。

    Oracle ADF Business Componentビジネス・イベントの作成および公開の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』を参照してください。

  3. SOAコンポジット・アプリケーションを作成し、EDLスキーマ・ファイルとXSDスキーマ・ファイルをSOAプロジェクトのルート・ディレクトリに手動でコピーします。次に例を示します。

    JDeveloper/mywork/SOA_application_name/SOA_project_name
    
  4. スキーマ・ファイルを、インポートに基づいて、EDLファイルからの適切な相対位置に格納します。

  5. 第39.3.1項「ビジネス・イベントをサブスクライブする方法」の説明に従って、Mediatorサービス・コンポーネントを作成します。

  6. 第39.3.1項「ビジネス・イベントをサブスクライブする方法」の説明に従って、「イベント・チューザ」ウィンドウでイベントのEDLファイルを選択します。

  7. Oracle Mediatorを起動するために、同じSOAコンポジット・アプリケーション内にBPELプロセス・サービス・コンポーネントを作成します。「詳細」タブの「入力要素」フィールドでは、手順2で作成したBusiness Componentビジネス・イベントXSDのペイロードを必ず選択します。

  8. BPELプロセス・サービス・コンポーネントをダブルクリックします。

  9. emailアクティビティをBPELプロセス・サービス・コンポーネントにドラッグします。

  10. ビジネス・イベントXSDのペイロードを参照して、「件名」フィールドおよび「本文」フィールドに入力します。

  11. SOAコンポジット・エディタのOracle Mediatorサービス・コンポーネントに戻ります。

  12. BPELプロセス・サービス・コンポーネントまたは2番目のOracle Mediatorサービス・コンポーネントのように、イベントを公開する2番目のサービス・コンポーネントを設計します。

    これで、SOAコンポジット・アプリケーションの設計は完了です。