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

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

Nacho Lafuente、Miquel Lopez-Miralpeix著

今回の WLI ユーザーのためのOracle SOA Suite基礎講座では、WebLogic Integrationのデータベース・イベント機能をOracle BPEL Process Managerで実装する方法について説明します。

2009年4月公開

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

この記事には、次のトピックが含まれます。

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

はじめに

情報システムのおもな目的の1つとして、データ処理の自動化があります。 現在のITニーズのほとんどは、データの保管、変換、そして交換に関するものです。 構造化された、アクセス可能な方法で、情報を永続化させるための選択肢として、データベースは圧倒的な普及率を誇ります。 統合作業には、資産を更新したり、イベント通知を受け取ってなんらかの処理をおこなったりするために、データベースとのやり取りが必要になる場合が多くあります。

この記事では、WebLogic Integration(WLI)とOracle SOA Suite、とくにOracle BPEL Process Manager(Oracle BPEL PM)が、データベースから開始されたイベントをどのようにリスニングするかに重点を置いて説明します。 また、イベントが検出されたあとの受信と処理について分析をおこないます。

この記事で提供される情報は、経験豊かなWLIユーザーが、Oracle BPEL PMにおけるデータベース・イベントの概念を理解し、Oracle SOA Suiteを素早く習得できるようにするためのものです。

Oracle BPEL PMについて詳しくは、『 Oracle BPEL Process Manager』を参照してください。

WLIデータベース・イベント・ジェネレータ

WLIイベント・ジェネレータの概要

WLIでは、イベント・ジェネレータ(EG)という概念が採用されています。 イベント・ジェネレータは、関連するシステムで発生したアクティビティに応じてイベントをトリガーします。 特定のイベントが発生すると、イベント・ジェネレータはメッセージ・ブローカ・チャネルを通じて、イベントに関する情報をパブリッシュします。 メッセージ・ブローカ・チャネルは、パブリッシュ処理とサブスクライブ処理をサポートする独立した通信パイプであり、JMSトピックによく似ています。

すべてのイベント・ジェネレータは、WLIプロセスがこのイベントを処理できるように、検出したイベントを監視および通知することを目的としています。

WLIイベント・ジェネレータは、次の2つのアプローチを使用して、システム変更を監視します。

  • ポーリング-このアプローチでは、イベント・ジェネレータは積極的に変更を監視して、ユーザーが定義した頻度でチェックを実行します。 データベース・イベント・ジェネレータを含む、ほとんどのイベント・ジェネレータでこのアプローチが使用されます。

  • オンデマンド-このアプローチでは、イベント・ジェネレータはリスニング・エンドポイントをセットアップしておき、イベントが発生するたびに通知を送信します。 HTTPイベント・ジェネレータでは、このアプローチが使用されます。

また、イベント・ジェネレータは、デプロイメント・タイプに応じて、クラスタ化することも、固定することも可能です。 クラスタ化に対応したイベント・ジェネレータは、クラスタ内のすべてのインスタンスに対して均等にデプロイされます。 固定イベント・ジェネレータは、クラスタ内のシングル・インスタンスに対してのみデプロイされるため、障害が発生した場合は、別のインスタンスに移行する必要があります。

次の表に、WLI 10.xで現在サポートされているイベント・ジェネレータを示します。

イベント・トランスポート イベント・ジェネレータがおこなう処理 イベント検出 デプロイメント
ファイル/FTP/SFTP ローカル・ファイル・システムまたはリモート・サーバー上のファイルに対する変更の監視 ポーリング 固定
電子メール 電子メール・アカウントに送信されたメッセージの読取り ポーリング 固定
JMS JMSトピックまたはJMSキューのサブスクライブによるメッセージ受信 ポーリング クラスタ化可能
タイマー 定期的な起動によるカスタム・イベントの通知、 ビジネス・カレンダーの使用 自己生成 固定
データベース(RDBMS) データベース・オブジェクトに対する変更の監視 ポーリング クラスタ化可能
HTTP 特定のURIおよび通知元に対するHTTPリクエストのリスニング オンデマンド クラスタ化可能
MQシリーズ JMSに似ているが、IBM WebSphere MQメッセージ・システムを使用 ポーリング クラスタ化可能
TIBCO RV JMSに似ているが、TIBCO Rendezvousメッセージ・システムを使用 ポーリング クラスタ化可能

データベース・イベント・ジェネレータのアーキテクチャ

データベース・イベント・ジェネレータは、WLI用語ではRDBMSイベント・ジェネレータと呼ばれます。 データベース・イベント・ジェネレータの説明、サポートされる機能、および制限事項について詳しくは、『 RDMBSイベント・ジェネレータ・ユーザーズ・ガイド』を参照してください。

データベース・イベント・ジェネレータは、データベースとの統合機能を提供することで、特定のイベントを検出し、メッセージ・ブローカ・チャネルを介してWLIへ内部的にパブリッシュするように設計されています。

イベント検出をサポートする計画には、イベント・トリガーとSQL Pre/Post 問合せの2種類があります。

イベント・トリガー計画はデータベース・トリガーを利用するように設計されており、イベント・ジェネレータは、挿入/更新/削除された行すべてを検出します。

イベント・ジェネレータがイベント・トリガーを使用するように設定されている場合、ユーザー表に対する変更を検出するトリガーを作成し、その変更をシャドウ表にコピーします。 シャドウ表は、データベース・イベント・ジェネレータが設定されている場合にWLIが作成する補助表であり、まだポーリングされていないイベントの一時ストアとして使用されます。

ある企業では、新しい従業員が入社するたびにビジネス・プロセスを開始する必要があります。 従業員の情報は、Oracleデータベースの表に格納されています。 ビジネス・プロセスはWLIを使用して実装されます。処理する必要のあるデータは従業員IDのみです。

従業員表へのデータ挿入を検出するために、WLIのデータベース・イベント・ジェネレータを使用します。 イベント・トリガー計画が選択されているため、WLIは従業員表への挿入に対応するトリガーを作成します。 トリガーは、従業員IDをシャドウ表にコピーしたのち、タイムスタンプなどの内部情報を追加します。 最終的に、イベント・ジェネレータがシャドウ表をポーリングして、最後に挿入された従業員IDを取得します。 この情報はメッセージ・ブローカ・チャネルにパブリッシュされ、WLIビジネス・プロセスが有効化されます。

SQL Pre/Post問合せ計画は、データを選択するカスタムSQL問合せを使用してイベントを検出し、パブリッシュしたあとで、Post問合せを実行するように設計されています。 この計画は、すべての必要情報をトリガーで取得できない場合、たとえば、2つの表を結合した結果得られる情報などに対して推奨されます。

  • 最初の問合せは、常に、一定の行数を返すSQL SELECT文でなければなりません。
  • デフォルトのPost問合せ(空の問合せ)では、ユーザー表から返された行は削除されます。
  • カスタムPost問合せでは、最初の問合せで返された列を参照する動的パラメータを利用できます。 動的な列には接頭辞として@がついており、Prepared Statementにおけるバインド変数と似ています。
  • Post問合せは、最初の問合せで返されたすべての行に対して実行されます。

あるオンライン・ストアでは、システムに注文が入るたびにビジネス・プロセスを開始する必要があります。 注文情報は、Oracleデータベースの複数の表に分散して格納されています。 ある表には注文した品目が格納されており、別の表には各品目の物理的な場所が、また別の表には一般的な注文情報が格納されています。 ビジネス・プロセスはWLIを使用して実装されます。処理する必要があるのはこれら3つの表から取得したデータです。 注文のフラグが"ready"ステータスに設定されている場合のみ、ビジネス・プロセスが開始されます。 WLIビジネス・プロセスの実行後、このフラグは"done"に変更される必要があります。 このフラグがいつ設定されるかについての保証はなく、挿入や更新とフラグ変更との間に関係性は存在しません。

注文表に対して変更を挿入するために、WLIのデータベース・イベント・ジェネレータを使用します。 ただし、イベント・トリガー計画では、いずれの条件をチェックすることもできないため、効率的ではありません。 WLIプロセスがフラグ・ステータスをチェックできるように、注文が挿入または更新されるたびにイベントを生成することは可能ですが、ここでは、このアプローチは非効率的であると判断しましょう。

この状況を解決するにあたって、SQL Pre/Post問合せ計画の方がはるかに効率的だと考えられます。 Pre問合せには、注文、場所、そして品目の情報を結合するSELECT文を設定することになるでしょう。 Post問合せでは、注文フラグを"processing"に変更するUPDATE文を実行します。

データベース・イベント・ジェネレータのポーリングにより、最終的に、Pre問合せが実行され、数行の情報が取得されます。 この情報は、メッセージ・ブローカ・チャネルにパブリッシュされます。 取得された情報のそれぞれの行に対して、データベース・イベント・ジェネレータはPost問合せを実行し、フラグを"processing"ステータスに変更します。 次に、WLIビジネス・プロセスが有効化され、正しく終了すると、ステータス・フラグは"done"に更新されます。

次に、データベース・イベント・ジェネレータのアーキテクチャを論理的に見た図を示します。 ユーザー情報は緑、データベース・イベント・ジェネレータのアーチファクトはオレンジ、ユーザー・アプリケーションのアーチファクトは青で表示されています。

データベース・イベント・ジェネレータは、次の順序で各処理を実行します。

  • スケジュール(イベント・ジェネレータ設定時に定義)に従って有効化します。
  • イベント・トリガー計画またはPre/Post問合せ計画の、いずれかの計画に従ってプロセッサを有効化します。
  • イベント・トリガー計画の場合
    • 複数プロセッサ構成による同時実行をサポートします-特定の要件がない限り、シングル・スレッドが推奨されます(デフォルト値)。
    • 複数のプロセッサが使用される場合、WLIでは、イベントの順序は保証されていません。
    • 各プロセッサは、シャドウ表に対して最大行の問合せをおこないます。
    • 各プロセッサは、取得した情報を設定済みのメッセージ・ブローカ・チャネルにパブリッシュします。
  • Pre/Post問合せ計画の場合
    • 1つのプロセッサのみが使用されます。
    • この唯一のプロセッサにより、設定されたPre問合せが実行され、複数の行が返されます。
    • 返される行がない場合、プロセッサは処理を終了します。
    • 返された行のそれぞれに対して、Post問合せが実行されることに十分注意してください。
    • 特別な空のPost問合せがサポートされています。 データベース・イベント・ジェネレータは、このPost問合せがある場合、処理中の行を削除する指示だと解釈します。 この機能は、Pre問合せで選択された情報が単一の表から取得されている場合にのみサポートされます。
    • そのほかすべてのカスタムPost問合せがサポートされます。 @接頭辞を使用すると、カスタムのバインド変数を使用できます。 それぞれの変数は、Pre問合せで使用された有効な列名を参照する必要があります。
    • プロセッサは、取得した情報を設定済みのメッセージ・ブローカ・チャネルにパブリッシュします。

データベース・イベント・ジェネレータの高度な概念

データベース・イベント・ジェネレータの設定

高度な設定情報について詳しくは、『 イベント・ジェネレータ』を参照してください。 データベース・イベント・ジェネレータに適用される各種の設定については十分に注意してください。 メッセージ・ブローカ・チャネル

データベース・イベント・ジェネレータは、取得した情報をメッセージ・ブローカ・チャネルにパブリッシュします。 この情報は、チャネル・タイプによって、XMLまたはRAW形式で表されます。

次に抜粋したXMLスキーマには、異なるメッセージ・ブローカ・チャネル定義が示されています。

<?xml version="1.0"?>
                                    
<channels xmlns="http://www.bea.com/wli/broker/channelfile"
channelPrefix="/DatabaseEventGenerator"
xmlns:eg="http://www.bea.com/wli/eventGenerator"
xmlns:dp="http://www.bea.com/wli/control/dynamicProperties"
xmlns:foo="http://www.bea.com/WLI/RDBMS_EG/databaseeg">

<!- A channel passing XML, the XML is element TableRowSet in the foo namespace ->
<channel name ="TypedXml" messageType="xml"
qualifiedMessageType="foo:TableRowSet"/>

<!- A simple channel passing XML ->
<channel name ="SimpleXml" messageType="xml"/>

<!- A simple channel passing String ->
<channel name ="SimpleString" messageType="string"/>

<!- A simple channel passing rawData ->
<channel name ="SimpleRaw" messageType="rawData"/>

</channels>

データベース・イベント・ジェネレータが、コンソールを使用するように設定されている場合、WLIは自動的にXMLスキーマを作成します。このXMLスキーマは、メッセージ・ブローカ・チャネルにパブリッシュされるXMLドキュメントの形式を反映したものです。 このスキーマに定義されたコンテンツは、データベース・イベント・ジェネレータが取得した表の列に応じて変わります。

このXMLスキーマは、イベント・ジェネレータ・ルールに従う名前をもつディレクトリ内のドメイン・ルートに配置できます。 デフォルトでこのXMLスキーマにつけられる名前は、TableRowSet.xsdです。 スキーマにより、最上部要素として、TableRowSetというラッパーが定義されます。 この最上部要素の目的は、1つのXMLドキュメント内に複数の行を表すことにあります。そうすることで、メッセージ・ブローカ・チャネル対して1度パブリッシュするだけで、同時に多数の行を表すことができます。 それぞれの行は、TableRow要素内に含まれます。 次に、XMLスキーマの例を示します。

1回のポーリングとイベントで処理できる最大行数

データベース・イベント・ジェネレータでは、1回のポーリングで処理できるイベント数と行数を制限できる設定パラメータが提供されています。

この機能を利用するには、データベース・ベンダー側で、返される行の最大数を制限する必要があります。 一部のデータベース・ベンダーでは、この機能をサポートしていないことに注意してください。

この動作を制御するのは、次の2種類のパラメータです。

  • Max Rows Per Poll-1回のポーリング・サイクルにおいて、1つのプロセッサ・スレッドが取得できる最大レコード数を定義します。
    • この数値は、1以上かつ10,000未満の有効な整数でなければなりません。
    • デフォルト値は、1です。
  • Max Rows Per Event-1つのイベントのペイロードに含まれるレコード数を定義します。
    • このパラメータは、パブリッシュされるイベントを表すXMLドキュメントに含まれるレコードの数を制御します。
    • このパラメータの値は、Max Rows Per Pollで指定された値と同じか、それより小さい値でなければなりません。

次の例を使用して、これらのパラメータについて検討してみましょう。 データベース・イベント・ジェネレータのポーラーが有効化されており、 問合せ対象のデータベースには、500レコードをもつ表が含まれます。 次の表では、パブリッシュされるイベントの数とコンテンツに対して、上記パラメータがどのように影響を及ぼすかについて示します。

Max Rows Per Poll Max Rows Per Event 選択された行数 パブリッシュされるイベントの詳細
10 10 5(5つのレジスタのみが選択可能だと仮定した場合) パブリッシュされるイベントは1つのみ。 このイベント内に5行が含まれる。 有効化されるWLIプロセスは1つのみ。
10 1 5(5つのレジスタのみが選択可能だと仮定した場合) パブリッシュされるイベントは5つ。 それぞれのイベントに1行ずつが含まれる。 有効化されるWLIプロセスは5つ。
1 1(ほかの値は無視される) 1(1つのレジスタのみが選択可能だと仮定した場合) パブリッシュされるイベントは1つのみ。 このイベント内に1行が含まれる。 有効化されるWLIプロセスは1つ。

トランザクションの動作

すべてのWLIプロセスはトランザクション型であり、この動作により、データベースのイベント処理にもメリットがあります。 WLIは、トランザクションをサポートおよび実施するため、Oracle WebLogic Server JTAを活用しています。 すべてのWLIプロセスにより、暗黙的トランザクションが定義され、ここからプロセスの有効化が開始されます。 問題なく終了すると、トランザクションはコミットされますが、なんらかのエラーが発生した場合、トランザクションはロールバックされます。

WLIメッセージ・ブローカは、WebLogic JMSをベースとしていますが、トランザクション型の動作もサポートしています。 データベース・イベント・ジェネレータは、内部的にJMSトランザクションを利用することで、イベントがトランザクション内で処理されるようにします。 データベース・イベント・ジェネレータはMDB(Message Driven EJB)として実装され、EJBコンテナのトランザクション機能を利用します。

次の図に、データベース・イベント・ジェネレータを使用する際のトランザクション境界を示します。 メッセージ・ブローカにより、このプロセスに含まれるトランザクションの境界が設定されます。

トランザクション#1は、イベント・ジェネレータの内部処理に関連するトランザクションです。 このトランザクションは、イベント・ジェネレータが有効化されると開始され、データベース処理、イベント作成、およびイベントのパブリッシュが含まれます。 エラーが発生しない場合、トランザクションはコミットされます。 なんらかのエラーが確認されると、トランザクションはロールバックされるため、データベースでの変更は破棄され、イベントはパブリッシュされません。

メッセージ・ブローカは、イベント処理からイベント生成を切り離します。 トランザクション#2は、WLIエンジンによってWLIプロセスの新規インスタンスが起動されると開始されます。このWLIプロセスは、データベース・イベントを含むメッセージ・ブローカ・チャネルをサブスクライブしているものです。 メッセージ・ブローカから取得したイベントが、WLIプロセスによって問題なく処理された場合、トランザクションはコミットされます。それ以外の場合、トランザクションはロールバックされます。

Oracleデータベース・アダプタ

Oracle Application Server Adaptersの概要

SOAソリューションに最適なOracle Application Server(Oracle AS) Adaptersは、Oracle Fusion Middlewareのコンポーネントであり、200以上のパッケージ・アプリケーションに対して、堅牢かつスケーラブルで柔軟な接続プラットフォームを提供します。 Oracle AS Adapters、Oracle BPEL PMなどのOracle SOA SuiteコンポーネントやJEEアプリケーションからも使用できます。

Oracle SOA Suiteのほかのアプリケーションと同様、Oracle AS Adaptersは、Websphereをはじめとする、WebLogicおよびOC4J以外のプラットフォームでも実行できます。 Oracle AS Adaptersは、新規アプリケーションと統合可能なサービスとして既存資産をパブリッシュすることで、これらの資産の再利用を可能にするとともに、"統合の最後の1マイル"を提供します。 Oracle AS Adaptersは、基盤となるバックエンド・アプリケーションをサービスとしてパブリッシュし、Oracle Fusion Middleware製品から起動可能なWSDLファイルの形にします。 Oracle AS Adaptersは、Web Service Definition Language(WSDL)、Web Service Invocation Framework(WSIF)、Java Connector Architecture(JCA)、XMLといった、各種の標準をサポートしています。

アプリケーション間の通信を容易にするために、アダプタが提供するサービスには、次の種類があります。

  • リクエスト-レスポンス(アウトバウンド・インタラクション): サービスは、バックエンド・データの作成、削除、更新、問合せと、バックエンドのワークフローおよびトランザクションのコールに使用できます。 たとえば、JEEアプリケーション・クライアントは、Oracle AS Adapter for SAPを使用して、SAPアプリケーション内に顧客を作成できます。

  • イベント通知(インバウンド・インタラクション) サービスは、バックエンド・イベントの変更をリスニングまたはポーリングします。 アダプタは、イベントをリスニングする際、アダプタにイベントをプッシュするように設定されているバックエンド・アプリケーションのリスナーとして登録されます。 これは、BPELプロセスにおいて設定されるアクティブ化エージェントによって実行されます。 イベントは、そのほかのメッセージと同じ方法で、クライアント・アプリケーションによって受信されます。 また、アダプタはバックエンド・アプリケーションをポーリングして、クライアント・アプリケーションが要求するイベントを確認することもできます。バックエンド・アプリケーションは、通常、データベースまたはファイルです。

  • メタデータ・サービス: アダプタのメタデータ定義には、バックエンド接続に関する情報とビジネス・オブジェクトおよびビジネス・サービスのスキーマが格納されます。 アダプタは、メタデータの参照および格納をおこなう設計時コンポーネントと、サービスを実行するランタイム・コンポーネントで構成されます。 アダプタのメタデータ定義は、XMLスキーマ定義(XSD)ファイルおよびWeb Service Definition Language(WSDL)ファイルとして生成されます。