BPEL WLIユーザーのためのOracle SOA Suite基礎講座

WLIデータベース・イベント・ジェネレータとOracleデータベース・アダプタの比較

Nacho Lafuente、Miquel Lopez-Miralpeix著

2009年4月公開

関連するダウンロード・リンク
 Oracle SOA Suite

[ 1ページ] [ 2ページ] [3ページ]

Receive Data」タブを選択し、イベント情報を一時的に保管する場所を選択します。 このプロセスは新しく作成されたものであり、変数は指定されていないため、新しく作成する必要があります。 "Select variables to assign"コンボ・ボックスから「 Create a new variable」オプションを選択します。

作成する必要のある変数のタイプはXMLであり、名前には"inputEvent"を指定します。 WLIにより、受信イベントを表すXMLドキュメントがこの変数に割り当てられます。

WLIプロセスを終了するには、Performノードを挿入して、"inputEvent"変数の値を出力します。

Node Paletteから「 Perform」ノードを選択し、メイン・ウィンドウのプロセス定義にドラッグして、最初のノードとFinishノードの間にドロップします。

結果のプロセスは、次のようになります。

Perform」ノードをダブルクリックしてから、「 View code」 リンクをクリックして、このノードのプロセス・ソース・コードを表示します。

次のコードを使用して、変数の値を出力します。

public void perform() throws Exception {
                                    
System.out.println("DatabaseEG inputEvent: " + inputEvent);
}

WLIプロセスのテスト

実際のデータベース・イベントを受信する前に、新しく作成したWLIプロセスのユニット・テストをおこないます。

テストの前に、WLIプロセス・アプリケーションを実行中のドメインにデプロイしておく必要があります。

はじめに、手動またはOracle Workshop for WebLogicを使用して、WLIドメインを開始します。

Oracle Workshop for WebLogicを使用してWLIドメインを開始し、サーバーにアプリケーションを追加するには、以下の手順に従います。

  • Window」→「 Open Perspective」の順に選択して、「 J2EE Perspective」を選択します。

  • GUIの下部に表示される「 Servers」タブを選択します。

  • Servers」タブを右クリックして、新規サーバーを追加します。 「 Oracle WebLogic Server version 10gR3」を選択して、ドメイン・ディレクトリを入力します。 結果は、次のようになります。
  • Serversタブの上部に表示された「 Run」アイコンまたは「 Debug」アイコンをクリックして、設定したWLIドメインを開始します。 Consoleタブに、実行中のWLIドメインの出力が表示されます。
<26-mar-2009 19H47' CET> <Info> <WebLogicServer> <BEA-000377>
                                    
<Starting WebLogic Server with Java HotSpot(TM) Client VM
Version 1.5.0_11-b03 from Sun Microsystems Inc.>
  • 次に、設定したドメインを右クリックして、「 Add and Remove Projects」を選択すると、次のダイアログが表示されます。
  • Add」をクリックして、DatabaseEGEARプロジェクトをドメインに追加してから、「 Finish」をクリックします。 ドメインが実行中である場合、選択したアプリケーションがデプロイされます。 実行中でない場合は、ドメインを開始してください。

  • Package Explorerで「 DatabaseEG.java」プロセス・ファイルを選択 し、右クリックします。 「 Run As」→「 Run on Server」の順に選択します。 サーバー上で初めてコンポーネントを実行する場合、次のダイアログが表示されます。 このダイアログを使用して、必要なコンポーネントを実行するサーバーを選択できます。 事前に選択されているサーバーを選択してから、「 Set Server as project default...」チェック・ボックスにチェックをつけて、今後はこのダイアログが表示されないようにします。
  • 新しいWebブラウザが開き、WLIプロセスのテスト・ブラウザが表示されます。 「 Test Form」タブを選択すると、プロセス・テストに使用するためのユーザー・フレンドリーなHTMLフォームが表示されます。

x0テキスト・ボックスに任意の有効なXMLを入力してから、「 subscription」ボタンをクリックします。 このサンプルでは、<foo/>XMLドキュメントが使用されています。

サーバー・ログは、次のような行を表示します。

DatabaseEG inputEvent: <foo/>
                                    

このトレース情報により、XMLドキュメントがメッセージ・ブローカ・チャネルに公開されると、WLIプロセスが起動されたことがわかります。

データベース・イベント・ジェネレータの作成

ここでは、実際のデータベース・イベント・ジェネレータを設定して、WLIプロセスがデータベースからイベントを受信できるようにします。 イベント・ジェネレータの設定に使用するWLI Administration Consoleは、 http://localhost:7001/wliconsoleからアクセスできます。使用するドメインに合わせて、ホスト名とポート番号を変更してください。

WLIコンソールを開き、左側のメニューから「 Event Generators」を選択します。 「 RDBMS」 →「 Create New」の順にクリックして、新しいデータベース・イベント・ジェネレータを作成します。

ジェネレータ名として"databaseEG"を入力し、「 Submit」をクリックします。 「 Define a New Channel Rule」をクリックして、メッセージ・ブローカ・チャネルに対してデータベース・イベントをパブリッシュする、特定のイベント・ジェネレータを作成します。

共通のイベント・プロパティに、次の情報を入力します。

このサンプルの目的から、Trigger Event Typeが選択されます。 このデータベース・イベント・ジェネレータは、HR.EMPLOYEES表に新しい従業員が追加されるたびに、新規イベントをパブリッシュするように設定されます。 別のスキーマを使用している場合、表の名前を変更してください。

Table Name」リンクをクリックして、所定の表を選択します。 スキーマ、オブジェクト・タイプ(TABLE)へと移動し、最後に「 EMPLOYEES」表を選択します。 または、"Table Name"テキスト・ボックスにHR.EMPLOYEESと入力することもできます。

データベース・イベント・ジェネレータの設定を完了するには、新しく行が挿入された際に、どの列を選択するかを指定する必要があります。 「 Select table columns to publish..」リンクをクリックすると、次のダイアログが表示されます。

Check All Columns」をクリックしてから「 Submit」をクリックして、すべての列をパブリッシュします。 次に、メイン・フォームで「 Submit」をクリックして、イベント・ジェネレータの設定を終了します。

新しくデータベース・イベント・ジェネレータが作成され、すでに実行されていることが次の表からわかります。

.

機能テスト

ここまでで、ユースケース全体をテストするための設定が完了しました。 コマンド・プロンプトで次の内容を入力して、HR.EMPLOYEES表に新規従業員を挿入します。

C:\WINDOWS>sqlplus HR/HR
                                    
SQL*Plus: Release 10.2.0.1.0 - Production on Lun Oct 27 23:06:03 2008
Conectado a:
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
SQL> insert into EMPLOYEES(EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL,
HIRE_DATE, JOB_ID) VALUES (500, 'Nacho', 'Lafuente', 'nacho.lafuente@bea.com',
SYSDATE, 'AD_VP');
1 fila creada.
SQL> commit;
Confirmacion terminada.
SQL> exit
Desconectado de Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production

イベント・ジェネレータのポーラーは、30秒の頻度を使用するように設定されています。 この時間が経過すると、サーバー・ログに次のトレース情報が表示されます。

DatabaseEG inputEvent: <TableRowSet xsi:schemaLocation="http://www.bea.com/
                                    
WLI/RDBMS_EG/databaseeg TableRowSet.xsd"
xmlns="http://www.bea.com/WLI/RDBMS_EG/databaseeg"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:wld="http://www.bea.com/2002/10/weblogicdata">
<TableRow wld:RowId="0" wld:RowState="Inserted">
<EMPLOYEE_ID>500</EMPLOYEE_ID>
<FIRST_NAME>Nacho</FIRST_NAME>
<LAST_NAME>Lafuente</LAST_NAME>
<EMAIL>nacho.lafuente@bea.com</EMAIL>
<PHONE_NUMBER xsi:nil="true"/>
<HIRE_DATE>2008-10-27T23:12:34+01:00</HIRE_DATE>
<JOB_ID>AD_VP</JOB_ID>
<SALARY xsi:nil="true"/>
<COMMISSION_PCT xsi:nil="true"/>
<MANAGER_ID xsi:nil="true"/>
<DEPARTMENT_ID xsi:nil="true"/>
</TableRow>
</TableRowSet>

このトレース情報から、設定したデータベース・イベントが検出され、WLIにパブリッシュされたことがわかります。 WLIプロセスによりイベントが受信され、イベントを表すXMLドキュメントが出力されました。

Oracle BPEL PMでのユースケースの実装

この章では、同じユースケースをOracle BPEL PMで実装していきます。

このユースケースでは、HIRE_DATE列に基づいて、新規従業員が取得されます。 次に、その手順を示します。

  1. ヘルパーとしてのシーケンス表の作成
  2. BPELプロセスの作成
  3. DBAdapterパートナー・リンクの作成
  4. BPELプロセスへの受信アクティビティの追加

ここまで実行すると、プロセスをデプロイする準備が整います。

シーケンス表

ヘルパー表に最終処理日を保管しておくことで、この表に保管された日付よりも新しいHIRE_DATEをもつ従業員を探すことができます。

ヘルパー表を作成するためのSQL文は、次のようになります。

CREATE TABLE SEQUENCING_HELPER (TABLE_NAME VARCHAR2(32) NOT
                                    
NULL,LAST_READ_DATE DATE);

BPELプロセス

ステップ0-Oracle JDeveloperのインストール

このステップは非常に簡単です。 OTNへアクセスして、Oracle JDeveloper 10gをダウンロードしたら、これを解凍するだけで完了です。

ステップ1-Oracle JDeveloperの起動

jdeveloper.exe」をダブルクリックします。

ステップ2-アプリケーションの作成

File」→「 New ...」→「 Application」の順に選択します。 詳細情報を入力してから、Application Templateで「 No Template」を選 択します。

ステップ3-BPELプロジェクトの作成

File」→「 New ...」の順に選択します。

最小限のプロジェクト情報(名前や名前空間など)とサービス・タイプ(ここではempty)を入力します。

DBAdapterパートナー・リンク

ステップ1-サービス一覧から「 DB Adapter」をドラッグ・アンド・ドロップし、サービス名を入力します。

ステップ2-データベース接続を指定します。 スキーマ情報を検索するためのデータベース接続をOracle JDeveloperのconnectionタブで作成していない場合、ここで作成する必要があります。

接続のJNDI名には、アプリケーション・サーバーで定義したものを指定する必要があることに注意してください(一致する名前がない場合、Oracle JDeveloper接続の詳細情報が実行時に使用されます)。

ステップ3-サービス・タイプとして「 Poll for New or Changed Records in a Table」 を指定します。

ステップ4-従業員表を選択してから「 Import tables ...」ボタンをクリックして、この表をインポートします。

ステップ5-不要な関係はすべて削除します(例:すべてを削除)。

ステップ6-必要な属性を選択します(例:すべてを選択)。

ステップ7-ポーリング計画として、 「 Update a Sequencing Table」を選択します。

ステップ8-ヘルパー表の詳細情報を入力します。

ステップ9-トランザクションと実行時のオプションを指定します(例:ポーリング頻度)。

ステップ10-行のポーリングに使用されるSELECT文を確認します。

アクティビティの受信

BPELプロセスにReceiveアクティビティを作成して、インバウンドのDBAdapterパートナー・リンクによって生成されたメッセージを受信する必要があります。

ステップ1-Process Activitiesパレットから、「 Receive」アクティビティをドラッグ・アンド・ドロップします。

ステップ2-パートナー・リンクへ関連づけます(左側の矢印をパートナー・リンクにドラッグします)。

ステップ3-名前を変更し、「 Create Instance」チェック・ボックスにチェックをつけます。

ステップ4-「 OK」をクリックして、新しい変数を作成します(上記スクリーンショットを参照)。

ここまでで、プロセスをOracle BPEL PMサーバーに デプロイして、テストする準備が整いました。 データベースに新しく行を作成すると(WLI機能テストの項で説明したとおり)、 BPELコンソールに新しいインスタンスが表示されます。

重要なポイントと推奨事項

使用するポーリング計画が異なるとはいえ、WLIとOracle BPEL PMは両方とも同じような方法でデータベースとやり取りでき、どちらのツールでもデータベース・イベントに相当するプロセス・インスタンスを作成できます。

Oracle BPEL PMは、データベースから受信するイベントに基づいた"インバウンド"・インタラクションを作成しますが、一方で、WLIでは、これらのイベントを受信するためにデータベース・イベント・ジェネレータの設定が必要になります。 また、Oracle BPEL PMは、BPELプロセス・インスタンスによって実行される任意のオンデマンド処理から"アウトバウンド"・インタラクションを作成しますが、WLIにはプロセス・インスタンスにおけるアウトバウンド処理に相当する概念がありません。

インバウンド処理に関して、WLIは2種類のトランザクションを生成することに注意が必要です。 1つはメッセージの収集用であり、もう1つは関連プロセスの実行用です。 Oracle BPEL PMも同じやり方で動作しますが、必要に応じて、両方の処理を同じトランザクションで実行することもできます。 また、Oracle BPEL PMでは、インバウンド・インタラクションを生成する方法が幅広く用意されていますが、 WLIでは2種類のポーリング計画に限定されています。

さらに、Oracle DBAdapterでは、関連する複数の表からネストしたXMLへのマッピングがサポートされています。 WLIで使用できるのはフラットなXMLマッピングのみであり、とくにアウトバウンド選択がサポートされていないため、これらはきわめて限定的になります。 組込みのO/Rマッピング・ツールであるTopLinkもまた、重要な差別化要素です。 TopLinkがもたらすおもな利点は、データベース・プラットフォームの移植性とサード・パーティ製データベースのサポートです。

最後に、Oracle DBAdapterのSQL抽象化により、SQLのコーディングは不要になります。 これにより、保守性が向上するだけでなく、たとえば、同じサービスを、あるケースではDB2に、また別のケースではOracleデータベースにデプロイすることが可能になります。 次の表に、Oracle BPEL PMとWLIの特性をまとめます。

特性 Oracle BPEL PM WLI
DBAdapter/RDBMS EGの設定 『ユー ザー・ガイド』 『ユー ザー・ガイド』
メッセージ構造 XSD XSD
イベントおよびプロセスにおけるトランザクションの動作 別々のトランザクションまたは単一トランザクション(カスタマイズ可能) 常に別々のトランザクション。 1番目のトランザクションはデータベースのポーリング時に開始され、WLIメッセージ・ブローカへのイベント送信が完了するとコミットされます。 2番目のトランザクションは、WLIプロセスがメッセージ・ブローカ・サブスクリプションからイベントを受信すると開始され、プロセスが正しく完了するとコミットされます。
ポーリング計画(インバウンド)
  • 物理削除ポーリング計画では、データベース表からレコードをポーリングし、処理したあと削除します。
  • 論理削除ポーリング計画では、処理された各行の特別フィールドを更新し、処理済みの行を除外するために、実行時にWHERE句を更新します。
  • シーケンス表:最終読取りIDポーリング計画では、順序値を保存するためにヘルパー表を使用します。
  • シーケンス表: 最終更新ポーリング計画では、last_updated値を保存するためにヘルパー表を使用します。
  • 制御表ポーリング計画では、まだ処理されていないすべての行の主キーを保存するために、制御表が使用されます。 このアプローチは簡素化されており、トリガーつきのシャドウ表を作成する必要はありません。 また、子表の更新に対するポーリングもサポートされています。
  • これらすべてのポーリング計画で、同時スレッド数の設定がおこなえます(バッチおよびデバッチの章を参照)。
イベント・トリガーとSQLポーリングの2種類の計画のみがサポートされています。

イベント・トリガー計画は、ソース表で削除/挿入/更新された値を格納するシャドウ(トリガーおよび表)を使用する点から、Oracle BPELのシーケンス表計画と似ています。 これらのシャドウ・コンポーネント(表およびトリガー)は、WLIによって自動的に作成されます。

SQLポーリング計画は、Oracle BPELとは微妙に異なるポーリング・アプローチです。 この計画では、2つのSQL文が使用されます。 1番目はレコードを取得するために使用され(Pre SQL)、2番目は前の結果によって動的に設定されます(Post SQL)。 この計画のもっとも一般的な使用法は、複雑な条件式を使用してレコードを取得することであり、通常、Post SQLにDELETE文が含まれます。 Oracle BPELでは、複雑な条件式をTopLinkの実行エンジンに委任することで、このユースケースをサポートしています。これらの複雑な条件式の設定は表示されず、Oracle AS Database Adapterの設定ウィザードを使用してカスタマイズできます。
処理(アウトバウンド)
  • Insert:データベースへ新規レコードを挿入します。
  • Update:データベースにある既存レコードを更新します。
  • Write:レコードが存在するかどうかは気にせず、レコードを挿入または更新します。
  • Delete:データベースからレコードを削除します。
  • Merge:はじめにデータベースから該当レコードを読み取り、変更を算出してから、最小限の更新を実行します。
  • Select:特定の条件に合ったレコードを検索します。 複数の問合せを別々の処理として定義できます。
  • PureSQL:TopLinkのバイパスにより任意のSQLを実行します。
  • QueryByExample:SELECT処理とは違い、設計時に選択条件を指定する必要はありません。
WLIでは特定のアウトバウンド処理は提供されておらず、WLIコントロールと一般的なBeehiveコントロール(『 コントロール』を参照)が利用されます。 標準でデータベース処理を提供するデータベース・コントロールが用意されており、SELECT、UPDATE、INSERT、DELETEなどが含まれます。
SQLの抽象化 Oracle TopLinkを利用。 ほとんどの場合、SQLコーディングは不要です。 任意の有効なJEE計画を利用できます。 通常、WLIアプリケーションは、Beehiveデータベース・コントロール、JEE JDBCロジック、またはサード・パーティ製のORMエンジン(TopLinkやKodoなど)を起動することで、データベース処理を実行します。
バッチおよびデバッチのサポート
  • NumberOfThreads: 同時スレッドの数。
  • MaxTransactionSize: 1回のトランザクションで、データベースからアダプタにフェッチされる最大行数。
  • MaxRaiseSize: 1つのメッセージとしてアダプタからBPELに送信される最大行数。
  • No Of Threads(Oracle BPELのNumberOfThreadsと同様)
  • Max Rows Per Poll(Oracle BPELのMaxTransactionSizeと同様)-1回のポーリング・サイクルにおいて、1つのプロセッサ・スレッドが取得できる最大レコード数を定義。
  • Max Rows Per Event(Oracle BPELのMaxRaiseSizeと同様)-1つのイベントのペイロードに含まれるレコード数を定義。
[ 1ページ] [ 2ページ] [3ページ]

著者について
Nacho LaFuente Nacho Lafuenteは、 Oracle SOA ConsultingのConsulting Technical Managerであり、 過去10年にわたって、ミドルウェア・スタックのテクノロジー・ソリューションに携わってきました。また、数多くの統合ソリューション・デリバリに参加した経験をもちます。 2008年にオラクルに入社する前は、BEA SystemsのEnterprise Architect Lead for Iberiaとして勤務していました。
Nacho LaFuente Miquel López-Miralpeixは、SOAおよび統合を専門とするOracle ConsultingのSenior Principal Consultantであり、製品ソリューションの啓蒙、設計、およびデプロイにおもな重点を置いています。 オラクルのパートナー企業に10年間勤務したのち、オラクルに入社して3年になります。