Topics
Service-Oriented Architecture
Oracle WLIファイル・コントロールとOracle File Adapterの比較Daniel Amadei、Heidi Buelow著 Oracle WLIユーザーのためのOracle SOA Suite基礎講座シリーズの今回の記事では、Oracle WebLogic Integration(Oracle WLI)のファイル・コントロール機能とOracle BPEL Process Manager(Oracle BPEL PM)の対応する機能を比較します。2009年5月公開
[ 1ページ] [ 2ページ] [ 3ページ] [ 4ページ] こ の手順の実行内容を理解することは重要です。readメソッドをプロセスにドラッグすると、ファイル・コントロールに指定されたファイルが読み取られま す。 readメソッドはStringを返すため、この戻り値を格納する変数として、すでに作成済みの変数fileContentを選択しました。 プロセスによって返される変数としてfileContentを選択したので、この変数にファイルから読み取ったコンテンツを格納することで、ファイルのコ ンテンツを返すことができます。
プロセスを右クリックし、「 Run As 」→「 Run On Server 」を選択して、プロセスを実行します。 以下のようなテスト・コンソール画面が表示されます。 テ スト・コンソールでは、プロセスのWSDLの取得、プロセス・グラフのビジュアル表示、プロセスを素早くテストするためのテスト・ページへの移動など、さ まざまなタスクを実行できます。 ここでは、テスト・コンソールを使用して、先ほど作成したプロセスをテストします。
/tmp/repositoryディレクトリにstringContent.txtと いう名前のファイルを作成します。 I will be read by WLI File Control!というテキストをファ イル内に入力します。 「 Test Form」タブを選択し、「 clientRequestWithReturn」ボタンをクリックして、プロセスを実行し ます。 Service Responseセクションに、ファイルのコンテンツ がプロセスによって読み取られ、返されたことが表示されます(下図)。 Oracle WLIによるXMLの受信、別のスキーマへの変換、ファイルの書込み以下の例では、XSDスキーマに準拠したXMLドキュメントを受信し、別のスキーマに変換します。このシナリオでは、サプライヤーや パートナーが期待しているスキーマに準拠するようにドキュメントを変換する必要があります。 最後に、変換されたXMLドキュメントを、Oracle WLIファイル・コントロールを使用してファイルに書き込みます。 かならず プロセスの視点で作業してください。 「 FCTLAppWeb」、「 src」 の順に開いて、「 processes.useCase01」パッケージを右クリッ クし、「 New」→「 Process」 を選択します。 パッケージの名前をprocesses.useCase02に変更します。 プロセスの名前としてTranslateStockProcessを 入力し、そのほかのオプションはそのままにして、「 Finish」をクリックしま す。 プロセスの 開始イベントを選択する画面が表示されます。 開始イベントとして「 Invoked via Client Request」を選択します(下 図)。 stocks.xsdファイルと STOCKS_PARTNER.xsdファイルを、サンプル・ファイル・フォルダから FCTLAppWebプロジェクトのスキーマ・フォルダにコピーします。 スキーマは解釈され、XMLBeansクラス形式にコンパイルされます。 コンパイルは即座に実行され、生成されたクラスはプロジェクトのCLASSPATH内で使用可能になります。 ここではstocks.xsdファイルに定義された stocks要素を、このプロ セスの入力ドキュメントとして使用します。 「 Client Request」ノードをダブルクリックして、プロセスの入力パラメータを追加しま す。 次のような画面が表示されます。 「 Add...」をクリックして新しい入力パラメータを追加し ます。 パラメータの名前と型を選択する画面が表示されます。 Parameter Nameに、 先ほど追加したパラメータの名前stocksを入力します。 型は、「 Browse...」 をクリックして手動で選択するか、「 Simple」、「 XML」、または「 Non-XML」 タブで値を選択することで、Oracle WLIによって検索された型から選択します。 ここではXMLから派生した型を選択するので、「 XML」 タブをクリックします。 XMLタブで、「 FCTLAppWeb」→「 schemas」 →「 stocks.xsd」の順に開いて、「 stocks」要素を 選択します。 このタブの表示は、スキーマ・フォルダにコピーしたXSDファイルの構造を反映しています。 入力パラメータの構成は下図と同じようになります。 最後に「 OK」 をクリックします。 次に、入力パラメータとして受信した値を、あとで使用できるように変数に格納しておきます。 「 Receive Data」項目をクリックし、 Select variables to assign:で「 Create new variable...」を選択します。 次の画面が表示されます。 変数名としてstocksを入力します。 型は入力パラメータの型から導出されます。 「 OK」をクリックします。 こ れで、XMLドキュメントを
stocksという名前の入力パラメータとして受信 し、そのコンテンツを同名の変数
stocksに格納するところまで出来上がりまし た。 次に、stocks変数に格納されたXMLドキュメントをパートナーのXMLスキーマに準拠した形式に変換します。
この変換を実行するには、「 processes.useCase02」 パッケージを右クリックし、「 New」→「 Transformation」を選択します(下図)。 変換にStockTransformationという名前をつけ、「 Finish」をクリックします。 変換は、標準のJava抽象クラスとして作成されます。 「 StockTransformation.java」ファイルを右クリックし、「 Transform」→「 Add XQuery Transformation Method」を選択します(下図)。 こ れにより、XQuery変換が標準のJavaメソッドとして公開されます。このメソッドは、プロセス・フローの一部として呼び出すことができます。
このメソッドにtransformStockToPartnerSchema、XQueryファイルにtransformStockToPartnerSchema.xqと いう名前をつけます(下図)。 「 Next」をクリックします。 次に、 Source Typeを選択します。 「 FCTLAppWeb」→「 schemas」→「 stocks.xsd」 →「 stocks」の順に開いて、「 Add」をクリックします。 選択した要素が Selected Source Typesに移動します(下 図)。 「 Next」をクリックします。 次に、 Target Typeを選択します。 「 FCTLAppWeb」→「 schemas」→「 STOCKS_PARTNER.xsd」 →「 STOCKS」の順に開いて、「 Add」をクリックします。 選択した要素が Selected Target Typesに移動します(下 図)。 「 Finish」をクリックします。 XQuery Mapper画面(下図)が表示されます。 Sourceタブ内の各アイテムを Targetタブ内の対応するアイテムにドラッグします。 操作結果が下図のように表示されます。 対応付けを終えたら、「 Save」ボタン をクリックするか、 [Ctrl]を押しながら [S]を押して、かならず作業内容を保存してください。 XQuery Mapperは、複雑な変換をグラフィカルに作成するためのユーティリティ・ツールです。 上図に示したとおり、単純なドラッグ・アンド・ドロップ操作で変換を作成できます。 XQuery Mapperでは、結合や単純でない変換など、より複雑なシナリオもサポートしています。同時に、Sourceタブにソースを提示して、生成された XQueryを自由に保守することも可能です。 また、Testタブを使用すれば、問合せのテストも簡単におこなえます。
これで変換の準備が整ったので、「 StockTransformation.java」 ファイルを、 Data Palette内の Controlsフォルダにドラッグします。 画面は下図のようになります。変換に追加したメソッドは、コントロールのメソッドとして使用可能になります。 次に、「 transformStockToPartnerSchema」 メソッドを、プロセス・フローの Client Requestノードの下にドラッ グします。 この時点で、プロセスは下図のようになります。 「 transformStockToPartnerSchema」 をダブルクリックして、変換メソッドに送信する情報および変換メソッドから受信する情報を構成します。 Send Data構成の Select variables to assignで「 stocks」変数を 選択します。 Receive Dataセクションに移動し、「 Create new variable」を選択して、新しい変数名としてpartnerStocksを 入力します。 入力したら、「 Close」をクリックして、変換ノードの構成を完 了します。 こ こまでで、パートナーが期待する形式のXMLドキュメントが用意できました。 あとは、ドキュメントをファイルに書き込めばユースケースが完成します。
次に、ファイル・コントロールをプロジェクトに追加します。 手順については前のセクションで説明したので、ここでは詳細な説明は割愛します。 インスタンス・プロパティにxmlFileControlと いう名前をつけ、「 Next」をクリックします。 インタフェースにXmlFileControlと いう名前をつけ、「 Next」をクリックします。 下図に示したとおりにコントロールを構成します。その際、 Type of Dataと して「 XmlObject」を指定する必要がある点に注意してください。これによ り、コントロールはXMLドキュメントを扱えるようになります。 作業が完了したら、「 Finish」 をクリックします。 使用可能なメソッドのリスト xmlFileControlから 「 write」メソッドをドラッグします。 Send Dataセ クションで「 partnerStocks」変数を選択し、 Receive Dataセクションでpropertiesという名前の 新しい変数を作成します。 作成したら、「 Close」をクリックします。 writeメソッドの呼出しを構成するとき、partnerStocks変数の値を、XMLファイル/tmp/repository/partnerStocks.xmlに 書き込むように指定しました。 以上でプロセスが完成したので、テストしてみます。 プロセスをテストするには、テストするプロセスを右クリックし、「 Run As」→「 Run On Server」を選択します。 テスト・コンソールが表示されたら、「 Test SOAP」タブを選択します。 Test SOAPタブを選択したのは、このオプションでは、入力XMLのペイロードが自動的に生成されるためです(下図)。 SOAP bodyセクションでデータを変更して、次のような XMLドキュメントになるようにします。
<clientRequest
「 clientRequest」ボタンをクリックすると、テス ト結果が表示されます。 「 更新」ボタンをクリックしてプロセスの完了を確認したら、 /tmp/repositoryディレクトリに移動して、 partnerStocks.xmlファイルが作成されているか確認します。 ファイルの内容は次のようになっています。 以 上で、サンプルは完了です。ここまでの説明で見てきたように、特定のスキーマ(stocks.xsd)に準拠したXMLドキュメントを受信し、別のスキー マ定義(STOCKS_PARTNER.xsd)に変換してパートナーに送信するための要件をシミュレートします。そして、ファイル・コントロールの XmlObjectファイル書込み機能を使用してファイルに書き込みました。 以上の操作によって、Javaオブジェクトの形式で表現されたXMLコンテンツ(実際には、XMLBeansコンパイラによって生成されたクラスのインス タンス)を出力できるようになりました。
Oracle WLIでのXMLの受信、CSV形式への変換、FTPを使用したファイルの書込みこの例では、ユースケース2で書き込んだXMLファイルをCSVファイルに変換します。 そのあと、変換されたファイルがファイル・コントロールを使用してFTPサーバーに送信される方法について説明します。 こ のケースでは、ファイル形式(このケースではCSV)を定義するため、MFLという概念を使用しました。MFLとは"非XMLデータのネイティブ表現と階 層構造を記述するXML言語で、非XMLデータのXML記述です。"
MFLファイルの作成には、Format Builderを使用しました。Format Builderは非XMLデータ表現を作成するためのGUIツールです。 Format Builderの詳細は、 こ ちらをご覧ください。 processes.useCase03パッケージ内にTransformXmlToRawDataAndWriteToFTPと いう名前の新しいプロセスを作成します。 開始イベントとして Invoked via Client Requestを 選択します。 processes.useCase02パッケージから「 XmlFileControl.java」をドラッグして、 Data Palette内の Controlsフォ ルダにドロップします。 こ こで、ユースケース#2で作成したコントロールを再利用しますが、ここではユースケース#2と違って、作成したファイルを読み取るために使用します。 コントロールは、ユーティリティ・プロジェクト内に配置して、さまざまなアプリケーション間で共有および再利用できるようにするのがベスト・プラクティス です。
「 read」メソッドをプロセスにドラッグします。下図のよう な状態になります。 「 read」ノードをダブルクリックします。 「 Receive Data」項目を選択し、新しい変数を作成するときのオプションを選択しま す。 ユースケース#2のときと同様、「 STOCKS」要素を選択します(下 図)。 選択したら、「 OK」→「 Close」の順にクリックします。 上 記の手順によって、コントロールの読取り操作の結果(XMLObjectのインスタンス)からSTOCKSクラスへのキャストが作成されます。
CSVファイル形式を表すMFLファイルを作成しました。 サンプル・ファイル・フォルダのMFLファイルをコピーして、スキーマ・プロジェクトに貼り付けます。 こ れにより、JavaのMFL表現と、それに対応するXML表現としてXMLObjectクラスが作成されます。 次に、partnerStocks.xmlファイルから読み取った内容が格納されているpartnerStocks変数を変換する変換オブジェクトを作成 します。 XQuery Mapperを使用して通常の変換オブジェクトを作成し、MFLファイルを表すクラスをインスタンス化してデータをCSV形式で使用可能にします。
RawDataTransformationという名前の新規変換オブジェクトを作成します。 変換オブジェクトにメソッドを追加して、transformPartnerStockToRawDataという名前をつけ、 XQueryファイルにはtransformPartnerStockToRawData.xqという名前をつけます。 Source Typeで、「 STOCKS」を選択します(下図)。 Target Typeで、「 stockquotes.mfl」 ファイルを展開し、「 Stocks」要素を選択して、 Selected Target Typesに追加します(下図)。 各フィールドを対応するフィールドにマッピングします(下図)。 作業を終えたらかならず変換結果を保存してください。 「 RawDataTransformation.java」 ファイルをドラッグして、 Data Paletteの Controlsフォルダにドロップします。 次に、「 transformPartnerStockToRawData」メソッドを、プロセスの readノードの下にドラッグします。 そうすると、プロセス・フローの一部として変換を呼び出すようになります。 「 transformPartnerStockToRawData」 ノードをダブルクリックして構成します。 Send Dataセクションで、「 partnerStocks」変数を選択します。 Receive Dataセクションで、stocksという名前の新しい変数を作成します。 「 Close」をクリックして構成を終了します。 この時点で、プロセスは下図のようになります。 こ こまでで、MFLを表すオブジェクトをXML形式で用意できました。 このstocks変数で表されるオブジェクトがあれば、MFLファイルから作成された別のオブジェクト(MFLオブジェクト)をインスタンス化できます。 このインスタンス化を実行するには、
newInstanceメソッ ドを呼び出します。その際、パラメータとしてstocksオブジェクトを渡します。 この操作を次の手順で実行します。
XMLオブジェクトをMFLオブジェクトに変換するにはまず、MFLオブジェクトを表す変数を作成します。 それには、 Data Paletteの 矢印を クリックして、「 Add a Variable...」を選択します。 変数にstocksMflObjectという名前をつけ、 Non-XMLタ ブで、「 FCTLAppWeb」→「 schemas」→「 stockquotes.mfl」 の順に開いて「 Stocks」を選択したうえで、型を選択します。 選択したら、「 OK」をクリックします。 プロセスに Performノードを追加して、" Instantiate MFLObject"という名前をつけます。 Perform ノード内では、任意のJavaコードを実行できます。 ここでは、先ほど作成したstocksMflObject変数をインスタンス化するために、Performノードを使用します。
今追加した「 Perform」ノードを右クリックして、「 View code」をクリックします。 コード・エディタが起動され、 performという名前のメソッドにジャンプします。 performメソッド内に次のコード行を追加します。
stocksMflObject = StocksMflObject.newInstance(stocks);
こ こまでで、フォーマットされたファイルのオブジェクト表現が生成されました。 次に、このオブジェクト表現をFTPサーバーに書き出します。
ローカルFTPをセットアップするには、 ftpserver-1.0.0-M3.zipファイルをダウンロードして、 /tmpフォルダに解凍します。 Windowsのコマンド・プロンプトまたはUnixのシェルで、/tmp/ftpserver-1.0.0-M3/binに移動しま す。 Windowsで、次のコマンドを実行します。
ftpd.bat res/conf/ftpd-typical.xml
Unixの場合は、次のコマンドを実行します(root権限が必要)。
ftpd.sh res/conf/ftpd-typical.xml
これにより、コンピュータ上でFTPサーバーが起動されます。起動時には、デフォルトのユーザー名adminとパス ワード"admin"が使用されます。 FTPサーバーが起動されると、画面には次のように表示されます。 次に、新しい ファイル・コントロールをアプリケーションに追加 します。 FtpFileControlという名前をつけ、下図のように構成し ます。 とくに Type of Dataに注目してください。これは、この File Controlが生データを扱うための専用のコントロールであることを示していま す。 Data Paletteの「 ftpFileControl」をクリックします。 Propertiesビューにプロパティが表示されます。 FileControl.Ftpプ ロパティに移動します(下図)。 FileControl.Ftpプロパティを次のように構成し ます。 localDirectoryプロパティについては少し説明が必要かも しれません。コントロールは、このディレクトリにファイルを書き出してからFTP経由でファイルを送信し、送信が完了したらファイルを削除します。 FileControl.FileInfoプロパティにはとく に注意してください。 directoryNameプロパティには、 C:/ではなく、単に/を設定する必要があります。 「 write」操作をドラッグしてプロセス内の最後のノードとしてドロップします。 stocksMflObject変数を送信し、操作結果を保持 するプロパティ名と同名の変数を Receive Dataセクションに作成するよ うに writeノードを構成します。 「 Close」をクリックしてプロセスを保存します。 以 上で、データをFTPに送信するファイル・コントロールの構成が完了しました。 テストしてみましょう。
テストするプロセスを右クリックし、「 Run As」→「 Run On Server」を選択します。 プロセスの実行中、すべての処理が正常に終了すると、 /tmp/repository/partnerStocks.xmlに 格納されていた株価を含むCSVファイルが /tmp/ftpserver-1.0.0-M3/res/homeディ レクトリに作成されます。 |