Topics
Service-Oriented Architecture
WLIデータベース・イベント・ジェネレータとOracleデータベース・アダプタの比較Nacho Lafuente、Miquel Lopez-Miralpeix著 2009年4月公開
Oracle Application Server Adaptersには、テクノロジー、パッケージ・アプリケーション、およびレガシー・アプリケーションの3種類があります。 以下のOracle ASテクノロジー・アダプタは、標準で提供されています。
Oracle BPEL PMとアダプタBPELプロセスとのやり取りがあるすべてのサービスは、パートナー・リンクと呼ばれます。 Oracle BPEL PMには、SOAPパートナー・リンクに対するネイティブ・インタフェースがありますが、そのほかのやり取りについてはアダプタが使用されます。 アダプタ・サービスは、BPELにおいて、そのほかのパートナー・リンクと同じように表されます。 BPELプロセスは、SOAPパートナー・リンクとやり取りする際も、アダプタ・パートナー・リンクとやり取りする際も、違いはありません。 Oracle BPEL PMのアダプタ向けクラスタリング・サポート注目すべき点は、アダプタがクラスタリングを完全にサポートしているため、基盤となるテクノロジーに最適なソリューションが提供されるということです。 アクティブ-アクティブ・クラスタ構成は、基盤となるテクノロジーがサポートしない場合があるため、すべてのアダプタに適しているわけではありません(ファイル・アダプタなど:多くのファイル・システムでは、同時実行性を制御できません)。このため、Oracle BPELのアダプタ・フレームワークでは、インバウンド・アダプタ・サービスのアクティブ・フェイルオーバーをサポートしています。 次の例に示すとおり、特定のJCAアクティブ化エージェントにプロパティを追加する(BPELプロセスのすべてのパートナー・リンクと、アクティブ化エージェントを格納したbpel.xmlファイルで指定する)ことで、これを実行できます。
<activationAgents>
クラスタ内のOracle BPEL PMサーバー(JVM)は、TCP/IPのサブネット境界にまたがって配置できます。これを実行するには、属性clusterAcrossSubnet=trueを追加します。 クラスタ・グループにおいて、同じアダプタ(たとえば、ファイル・アダプタ)のアクティブ化エージェントが、(特定のパートナー・リンクに対して)複数アクティブ化されると、そのクラスタ内でアクティブな、すべてのアダプタ・フレームワーク・インスタンスによって暗黙的かつ自動的に検出がおこなわれます。 実際にメッセージの読取りまたはパブリッシュを開始できるのは、1つのアクティブ化だけです。 アダプタ・フレームワーク・インスタンスの中から、プライマリのアクティブ化を引き受ける1つのインスタンスがランダムに決定されます。 クラスタ内の残りのアクティブ化(インスタンス)はホット・スタンバイ状態を開始しますが、実際には、JCAリソース・アダプタに対してエンドポイントをアクティブ化しません。 ある時点で、プライマリのアクティブ化が応答しなくなった場合、手動で無効化をおこないます。プライマリがクラッシュまたは終了した場合は、クラスタ・グループの残りのアダプタ・フレームワーク・メンバーのうちの1つによってすぐに検出され、スタンバイしているいずれかのアクティブ化エージェントに、アクティブ化のプライマリとしての役割が再割当てされます。 この機能の実装には、内部で、JGroupsのclusterGroupIdプロパティが使用されています。 バッチおよびデバッチのサポートバッチ機能とデバッチ機能をサポートしているのは、Oracle AS Adapters for Files、Oracle AS Adapters for FTP、およびOracle AS Adapters for Databasesです。 Oracle AS Adapters for FileとOracle AS Adapters for FTPは、1つの大きなファイルを数個のバッチにデバッチするためのリーダーで構成されており、最適なメッセージ・サイズを選択できます。 設計時の設定において、バッチ・サイズを指定しておく必要があります。 また、アダプタには、一連のメッセージを1つのファイルにバッチ化するライターが含まれています。 Oracle AS Adapters for Databasesは、一連の表をポーリングしてイベントを検出するパブリッシュ・コンポーネントで構成されています。 このコンポーネントは、BPELプロセスにイベントを発生させる際、一度に1レコードまたは複数レコードを処理できます。 同様に、バッチ書込みを使用して、1回の起動で複数レコードをデータベースに挿入できます。 Oracle AS Adapters for Databases(DBAdapter)Oracle AS Adapters for Databasesでは、XMLデータ(オブジェクト)からリレーショナル・スキーマへ、またその逆へのマッピングに使用するテクノロジーとして、Oracle Toplinkを使用しています。 多くの場合、SQLコーディングの必要はなく、ほとんどの設定はアダプタ・ウィザードからおこなえます。 上記アーキテクチャの結果として、JDBCに準拠したすべてのデータベースがサポートされており、また、接続の詳細は、プロセス・レベルでもアダプタ・レベルでも、またはJEEコンテナ・データソースとしても供給できるため、ほかのアプリケーションとのプール共有が可能になります。 これにより、あらゆる状況に適した、きわめて柔軟な接続管理が実現されます。 アウトバウンド・インタラクションの場合、次のとおり、多数の処理が実行できます。
インバウンド・インタラクションの場合、以下のいずれかのポーリング計画を選択できます。
例 ある企業では、新しい従業員が入社するたびにビジネス・プロセスを開始する必要があります。 従業員情報は、Oracleデータベースの表に格納されています。 ビジネス・プロセスはOracle BPEL PMを使用して実装されます。処理する必要のあるデータは従業員IDのみです。 従業員表へのデータ挿入を検出するために、DBAdapterを使用します。 順序表ポーリング計画または制御表ポーリング計画が使用できますが、ここでは、もっともWLIに似ている制御表ポーリング計画を使用します。 従業員表の主キーを格納する列をもつ制御表を作成する必要があります。 従業員表にトリガーを作成しておき、従業員が作成されるたびに制御表にレコードを挿入します。次に、制御表をポーリングして、制御レコードとその子レコード(実際の従業員レコード)を読み取るように、DBAdapterを設定します。 最後に、残りのいずれかのポーリング計画を制御表に適用して、従業員の再処理を防ぎます。 設計時に、ユーザーは複数の関連表をインポートできます。 DBAdapterによってすべての外部キーが調査され、可能性があるすべての関係が提示されるため、ユーザーはここから選択できます。 または、論理制約を使用して、ユーザーが独自にウィザード内で関係をモデリングすることもできます。 生成されたXML構造は、選択された表をルートのXML要素として、そして結合された表をサブタイプやコレクションとして、ネストされています。 次に、このようなデータ構造の例を示します。
<xs:complexType name="Departments">
このデータ構造では、Employeesというタイプの要素managerが、部門と従業員のN対1関係を表しており、もう1つの要素departmentCollectionが、部門と従業員の1対N関係を表す従業員リストに相当していることがわかります。 以上のとおり、Oracle BPEL PMは、常にネイティブでXML構造を処理し、SQLタイプやコマンドへの変換をおこなうアダプタの役割を果たします。 例: あるオンライン・ストアでは、システムに注文が入るたびにビジネス・プロセスを開始する必要があります。 注文情報は、Oracleデータベースの複数の表に分散して格納されています。 ある表には注文した品目が格納されており、別の表に各品目の物理的な場所が、また別の表に一般的な注文情報が格納されています。 ビジネス・プロセスはOracle BPEL PMを使用して実装されます。処理する必要があるのはこれら3つの表から取得したデータです。 注文のフラグが"ready"ステータスに設定されている場合のみ、ビジネス・プロセスを開始します。 Oracle BPEL PMのビジネス・プロセスが実行されたあとで、このフラグを"done"に変更する必要があります。 最善のアプローチは、2つのパートナー・リンク(インバウンド用とアウトバウンド用)を作成することです。 1)論理削除ポーリング計画のポーリング・サービスを作成し、フラグ列をもつ表をルート表として選択すると、残りの表は関係を通じて追加されます。 次に、読み取られていないことを示す値として"ready"を選択し、"in-process"などの値を読取り済み(取得されているが処理は終了していない)として新たに作成します。 2)プロセスの最後で、アウトバウンドDBAdapterサービスのマージ処理を使用して、フラグ値を"done"に変更します。 次に、データベース・アダプタのアーキテクチャを論理的に見た図を示します。 インバウンドDBAdapterは、次の順序で各処理を実行します。
DBAdapterの高度な概念DBAdapterの設定高度な設定について詳しくは、『 Oracle® Application Server Adapters for Files, FTP, DatabasesおよびEnterprise Messagingユーザーズ・ガイド』を参照してください。 DBAdapterに適用される各種の設定については、十分に注意してください。 メッセージ構造DBAdapterパートナー・リンクは、設計時のパートナー・リンク生成で定義されたXMLスキーマに準拠したメッセージをパブリッシュ(インバウンド)および受信(アウトバウンド)します。 BPELプロセスの観点から見ると、一般的なSOAPパートナー・リンクとDBAdapterパートナー・リンクの間で、メッセージ操作に違いはありません。 1回のポーリングとイベントで処理できる最大行数DBAdapterの1回のポーリングとイベントで処理できる行数は、次のパラメータを設定することで制御できます。
トランザクションの動作すべてのBPELプロセスはトランザクション型であり、DBAdapterにもこの動作によるメリットがあります。 インバウンド・インタラクションの場合、パラメータdeliveryPersistPolicy(off.immediateまたはon)の値によって、取得プロセスと削除プロセスがBPELプロセスのトランザクションに含まれるケースと、別のトランザクションになるケースがあります。 deliveryPersistPolicyがon(デフォルト値)に設定されている場合、メッセージはデリバリ・サービス(DS)に保持され、処理可能になったMDBスレッドによって処理されます。 deliveryPersistPolicyがoff.immediateに設定されている場合、メッセージはDSに保持されず、アダプタ・スレッドがBPELプロセスを実行します。 プラットフォームの問題によってメッセージが処理されない場合、トランザクションはロールバックされ、次回、再度読み取られます。 WLIの場合、この機能が提供されていないため、処理は常に、メッセージ取得(1つのスレッド)とそのあとのメッセージ処理(非同期で有効化されるもう1つのスレッド)に分かれます。 これにより、データベース・トラフィックを削減する必要がある場合に、信頼性を損なうことなくこれを実現できるため、BPELプロセス のチューニングの柔軟性が大幅に向上します。 アウトバウンド・インタラクションは、BPELプロセス・トランザクションの内部で処理されます。 データソースがJEEコンテナ・レベルでどのように定義されているか(グローバル・トランザクションまたはローカル・トランザクション)、また、実行対象となるデータベースのプロシージャまたはファンクションにCOMMITやROLLBACKが含まれているかどうかを考慮に入れることが重要です。 ユースケースの例WLIでのユースケースの実装プロセス・アプリケーションの作成この記事に記載されているWLIサンプルを実行するには、はじめにプロセス・アプリケーションを作成し、WebLogic Integrationドメインにデプロイする必要があります。 ドメイン作成手順について詳しくは、『Creating WebLogic Domains Using the Configuration Wizard』を参照してください。 プロセス・アプリケーションを作成するには、以下の手順に従います。
サンプル・データベース・スキーマの追加WLIがどのようにデータベース・イベントを検出し、処理するかを完全に説明するには、サンプル・データベースが必要です。 このユースケースは、Oracle 10g Express Edition(XE)と事前にロードされているHuman Resourcesスキーマを使用するように意図されています。 別のデータベースやスキーマを使用しても、機能に問題はありません。 WLIから、イベントを取得する元となるデータベース・スキーマの場所が特定できる必要があります。 データベース・イベント・ジェネレータの設定をおこなう前に、少なくとも1つのデータベース・プールを作成してください。 WebLogic Administration Consoleを使用してJDBCデータソースを作成する方法については、『 JDBC データソースの作成』を参照してください。 このサンプルでは、Oracle Thin/XAドライバを使用して、databaseEGPoolというデータベース・プールを作成しています。このドライバは、Oracle 10g XEに同梱されているHuman Resources(HR)スキーマを参照します。 データベース・イベントを処理するWLIプロセスの作成データベースで生成されたイベントを処理するために、サンプルのWLIプロセスを作成します。 このプロセスはイベント受信の説明のみを目的としており、そのほかの処理は実行しません。 "databaseeg"という名前の新規パッケージを作成します。 このパッケージ、"DatabaseEGWeb"プロジェクトの"Java resources"フォルダ内に作成されます。
このプロセスはメッセージ・ブローカ・チャネルを介して有効化されるため、新規チャネル定義を作成する必要があります。 このチャネル定義は、先ほど作成した"DatabaseEGWeb"プロジェクトの"databaseeg"Javaパッケージ内に作成します。
<?xml version="1.0"?>
チャネル定義を作成したら、データベース・イベントを処理する新しいWLIプロセスの作成を開始します。
この結果作成される、空のWLIプロセスを次の図に示します。 メッセージ・ブローカ・チャネルがメッセージを受信すると、このプロセスは有効化されます。 開始ノードをダブルクリックすると、ダイアログが表示され、プロセスの起動方法を選択できます。 「 Subscribe to a Message Broker Channel...」を選択します。 開始ノードをダブルクリックして、「 General Settings」タブを選択します。 このプロセスがリスニングするチャネル名として、先ほど作成したチャネル定義「 /DatabaseEventGenerator/SampleXml」 を選択します。 |