5 ファイル/FTP用のOracle JCAアダプタ

ここでは、Oracle BPEL Process ManagerおよびOracle Mediatorで動作する、Oracleファイル・アダプタおよびOracle FTPアダプタの使用方法を学習します。これらは、同様の機能を持つ個別のアダプタです。

5.1 Oracleファイル/FTPアダプタの概要

Oracle BPEL PMメディエータには、Oracleファイル/FTPアダプタが組み込まれています。

Oracleファイル/FTPアダプタを使用すると、ローカル・ファイル・システムやリモート・ファイル・システムのファイルを(ファイル転送プロトコル(FTP)を使用して) BPELプロセスまたはメディエータで交換(読取りおよび書込み)できるようになります。ファイルは、XMLとXML以外のデータ形式のどちらでもかまいません。

5.1.1 Oracleファイル/FTPアダプタのアーキテクチャ

Oracleファイル/FTPアダプタはJCA 1.5アーキテクチャに基づいています。JCAでは、異機種間のエンタープライズ情報システム(EIS)の統合に標準アーキテクチャを提供します。Oracleファイル/FTPアダプタのJCAバインディング・コンポーネントでは、基盤となるJCA相互作用がOracle BPEL PM統合のサービス(JCAバインディングを使用したWSDL)として公開されています。Oracle JCAアダプタのアーキテクチャの詳細は、Oracle JCAアダプタの概要」を参照してください。

5.1.2 Oracleファイル/FTPアダプタOracle BPEL PMの統合

Oracleファイル/FTPアダプタOracle BPEL PMと自動的に統合されます。Oracle JDeveloperの「コンポーネント」ウィンドウからファイル・アダプタまたはFTPアダプタをドラッグ・アンド・ドロップすると、アダプタ構成ウィザードが起動して「ようこそ」ページが表示されます。

このウィザードでOracleファイル/FTPアダプタを選択して構成できます。サービス名を入力してください。

図5-1 「アダプタ構成ウィザード - サービス名」ページ

図5-1の説明が続きます
「図5-1 「アダプタ構成ウィザード - サービス名」ページ」の説明

構成が完了すると、Oracle JDeveloperの「アプリケーション・ナビゲータ」セクションにWSDLJCAのファイルのペアが作成されます。(JDeveloper)このJCAファイルには、アダプタ構成ウィザードで指定する構成情報が含まれます。

アダプタ構成ウィザードの「操作タイプ」ページで、実行する操作の選択を求められます。選択内容に応じて、アダプタ構成ウィザードの別のページが表示され、構成情報の入力を求められます。表5-1に実行可能な操作をリスト表示し、指定する必要のある構成情報が説明されている項を示します。

表5-1 Oracle BPEL Process Managerについてサポートされている操作

操作

Oracleファイル・アダプタ

-

  • Read File(インバウンド操作)

Read Fileの説明

  • Write File(アウトバウンド操作)

Write Fileの説明

  • 同期Read File(アウトバウンド操作)

同期Readの説明

  • List Files(アウトバウンド操作)

ファイル・リスティングの説明

  • Oracle FTPアダプタ

-

  • Get File(インバウンド操作)

Get Fileの説明

  • Put File(アウトバウンド操作)

Put Fileの説明

  • 同期Get File(アウトバウンド操作)

同期Get Fileの説明

  • List Files(アウトバウンド操作)

ファイル・リスティングの説明

Oracle JCAアダプタとOracle BPEL PMの統合の詳細は、Oracle JCAアダプタの概要」を参照してください。

5.1.3 Oracleファイル/FTPアダプタメディエータの統合

Oracleファイル/FTPアダプタメディエータと自動的に統合されます。JDeveloperデザイナでOracleファイル/FTPアダプタ・サービスを作成すると、アダプタ構成ウィザードが起動します。

このウィザードでOracleファイル/FTPアダプタを選択して構成できます。構成が完了すると、JDeveloperの「アプリケーション・ナビゲータ」セクションにWSDLJCAのファイルのペアが作成されます。このJCAファイルには、アダプタ構成ウィザードで指定する構成情報が含まれます。

アダプタ構成ウィザードの「操作タイプ」ページで、実行する操作の選択を求められます。選択内容に応じて、アダプタ構成ウィザードの別のページが表示され、構成情報の入力を求められます。表5-2に実行可能な操作をリスト表示し、指定する必要のある構成情報が説明されている項を示します。アダプタおよびメディエータの詳細は、Oracle JCAアダプタの概要」を参照してください。

表5-2 Oracle Mediatorについてサポートされている操作

操作

Oracleファイル・アダプタ

-

  • Read File(インバウンド操作)

Read Fileの説明

  • Write File(アウトバウンド操作)

Write Fileの説明

  • 同期Read File(アウトバウンド操作)

同期Readの説明

  • List Files(アウトバウンド操作)

ファイル・リスティングの説明

Oracle FTPアダプタ

-

  • Get File(インバウンド操作)

Get Fileの説明

  • Put File(アウトバウンド操作)

Put Fileの説明

  • 同期Get File(アウトバウンド操作)

同期Get Fileの説明

  • List Files(アウトバウンド操作)

ファイル・リスティングの説明

5.1.4 Oracleファイル/FTPアダプタとSOAコンポジットの統合

コンポジットは、設計されて単一アプリケーションにデプロイされるサービス、サービス・コンポーネント(Oracle BPEL PMおよびメディエータ)、ワイヤおよび参照のアセンブリです。コンポジットにより、メッセージに記述された情報が処理されます。コンポジットの詳細は、composite.xmlファイルに格納されます。Oracleファイル/FTPアダプタとSOAコンポジットの統合の詳細は、「Oracle SOAコンポジットとアダプタの統合」を参照してください。

5.2 Oracleファイル/FTPアダプタの機能

Oracleファイル/FTPアダプタを使用すると、ローカルやリモートのファイル・システムのディレクトリを操作するようにBPELプロセスまたはメディエータを構成できます。

ここでは、Oracleファイル/FTPアダプタが持つ次の機能について概略を示します。

ノート:

大量の同時メッセージを使用するように設計されたOracleファイル/FTPアダプタを使用するコンポジットの場合は、オペレーティング・システムのオープン・ファイル数パラメータを大きい値に設定する必要があります。たとえば、Linuxのオープン・ファイル数パラメータを8192に設定するには、ulimit -n 8192コマンドを使用します。

5.2.1 ファイル形式

Oracleファイル/FTPアダプタでは、次のファイル形式の読取りおよび書込みが可能で、実行時にアダプタ・トランスレータ・コンポーネントが使用されます。

  • XML (XSDおよびDTDベースの両方)

  • デリミタ

  • 位置固定

  • バイナリ・データ

  • COBOLコピーブック・データ

Oracleファイル/FTPアダプタでは、ファイル・コンテンツを不透明(Opaque)オブジェクトとして処理し、コンテンツを(変換を実行せずに)元の形式で渡すこともできます。不透明オプションでは、構造をXSDで取得できないJPGやGIFなどのバイナリ・データや、変換の不要なデータが処理されます。

不透明表現base-64ではペイロードがエンコードされ、インメモリー・ペイロードのサイズが1/3増加することに注意してください。不透明/base-64表現は通常、XML内のバイナリ・データを渡すために使用されます。添付のサポートの詳細は、「大きなペイロードのサポート」も参照してください。

トランスレータにより、様々なフォーマットのネイティブ・データからXMLへの変換、およびXMLから他のフォーマットへの変換を、Oracleファイル/FTPアダプタで実行できるようになります。ネイティブ・データは単純な形式(フラット構造)または複雑な形式(親子関係)のいずれかです。トランスレータでは、XMLフォーマットのデータと非XML(ネイティブ)フォーマットのデータの両方を処理できます。

5.2.2 FTPサーバー

Oracle FTPアダプタは、すべてのプラットフォームでRFC 959準拠のほとんどのFTPサーバーをサポートしています。Oracle FTPアダプタでは、その他のFTPサーバーをサポート可能にするプラガブル・メカニズムも利用できます。さらに、Oracle FTPアダプタは、SolarisおよびLinuxでFTP Over SSL (FTPS)をサポートしています。Windowsの場合、Oracle FTPアダプタは、OpenSSLを使用したFileZilla FTPサーバーおよびWindows IIS FTPサーバーで動作確認されています。

Oracle FTPアダプタはまた、SSHトランスポートを使用したSFTP (セキュアFTP)もサポートしています。

ノート:

Oracle FTPアダプタは、バージョン3以降のSFTPサーバーをサポートしています。

5.2.3 インバウンドおよびアウトバウンド相互作用

Oracleファイル/FTPアダプタでは、インバウンド方向およびアウトバウンド方向でファイルの交換が行われます。交換の方向により、Oracleファイル/FTPアダプタで実行されるタスクの内容は異なります。

Oracle BPEL PMまたはメディエータに送信されるインバウンド・ファイルの場合、Oracleファイル/FTPアダプタでは次の操作が実行されます。

  1. ファイル・システムのポーリングによる一致ファイルの検索

  2. ファイル・コンテンツの読取りおよび変換。ネイティブ・データは、設計時に定義されたネイティブ・スキーマ(NXSD)に基づいて変換されます。

  3. 変換済コンテンツのXMLメッセージとしてのパブリッシュ

Oracleファイル/FTPアダプタのこの機能は、ファイル読取り操作と呼ばれます。

Oracle BPEL PMまたはメディエータから送信されるアウトバウンド・ファイルの場合、Oracleファイル/FTPアダプタでは次の操作が実行されます。

  1. BPELまたはメディエータからのメッセージの受信。

  2. 設計時に指定されたXMLコンテンツの書式設定。

  3. 出力ファイルの生成。出力ファイルは、基準(経過時間、ファイル・サイズおよびメッセージ数)に基づいて作成されます。これらの基準の組合せを出力ファイル用に指定することもできます。

Oracleファイル/FTPアダプタのこの機能はファイル書込み操作と呼ばれます。この操作は、JCAアウトバウンド相互作用と呼ばれます。

インバウンドおよびアウトバウンドの方向ごとに、Oracleファイル/FTPアダプタでは一連の構成パラメータが使用されます。たとえば:

  • インバウンドのOracleファイル/FTPアダプタでは、入力ファイルが配置されるインバウンド・ディレクトリ用のパラメータと、ディレクトリをポーリングする頻度が設定されます。

  • アウトバウンドのOracleファイル/FTPアダプタでは、ファイルを書き込むアウトバウンド・ディレクトリ用のパラメータと、使用するファイル・ネーミング規則が設定されます。

ノート:

パブリッシュ・サイズ、メッセージ数およびポーリング頻度などの構成パラメータを変更するには、アダプタ構成ウィザードを使用する必要があります。

JCAファイル内のこれらのパラメータの値を手動で変更しないでください。

ファイル・リーダーではポーリング規則がサポートされており、いくつかの後処理オプションが用意されています。処理後にファイルを削除するか、移動するか、またはそのまま保持するかを指定できます。ファイル・リーダーでは、単一のメッセージとしてではなく、ファイル・コンテンツを分割してバッチで公開できます。この機能は、Oracleファイル/FTPアダプタのパフォーマンス・チューニングに使用できます。ファイル・リーダーでは、ファイルが何度も配信されることはありません。

Oracleファイル/FTPアダプタの読取りと書込みの機能の詳細は、次のトピック参照してください:

5.2.4 ファイルのデバッチ処理

.jcaファイル内でpublishSizeパラメータを使用して、バッチ・サイズを定義できます。

このプロパティは、ファイルに複数のメッセージがあるかどうか、およびBPELプロセスに一度にパブリッシュするメッセージ数を指定します。

たとえば、あるファイルに11個のレコードがあり、このパラメータが2に設定されている場合、そのファイルでは一度に2レコードずつ処理され、最終レコードは6回目に処理されます。

ファイルに複数のメッセージがある場合には、特定数のバッチでメッセージをパブリッシュすることを選択できます。これはデバッチと呼ばれます。デバッチ中、再開と同時にファイル・リーダーは、前回の実行時に中断した場所から処理するため、メッセージが重複することはありません。XMLフォーマットとネイティブ・フォーマットのファイルでは、ファイルのデバッチ処理がサポートされています。

最終バッチがデバッチ・シナリオに達したときに呼び出されるバッチ通知コールバック(Javaクラス)を登録できます。

<service ...
  <binding.jca ...
    <property name="batchNotificationHandler">java://oracle.sample.SampleBatchCalloutHandler </property>

ここで、プロパティ値は java://{custom_class}であり、oracle.sample.SampleBatchCalloutHandler が実装されている必要があります

package oracle.tip.adapter.api.callout.batch;
public interface BatchNotificationCallout extends Callout
{
    public void onInitiateBatch(String rootId,
                                String metaData)
        throws ResourceException;
    public void onFailedBatch(String rootId,
                              String metaData,
                              long currentBatchSize,
                              Throwable reason)
        throws ResourceException;
    public void onCompletedBatch(String rootId,
                                String metaData,
             			                   long finalBatchSize)
        throws ResourceException;

5.2.5 ファイルのチャンク読取り

ファイルのチャンク読取り操作では、大きなファイルの処理が可能になり、whileループ内でBPEL invokeアクティビティを使用してターゲット・ファイルが処理されます。

具体的には、ファイル・アダプタによって、BPELプロセス・モデラーはinvokeアクティビティを使用して非常に大きなファイルから論理チャンクを取得できるため、ファイルのメモリー制限を超えません。このプロセスでは、ループ内でチャンク相互作用をコールすることにより、一度に1つずつ論理チャンクを実行してファイル全体を処理します。目的は、ファイルのアウトバウンド処理でデバッチ処理できるようにすることです。

ファイル・アダプタ構成ウィザードを使用して、チャンク・ファイル(JCAファイル)およびWSDLファイルを定義します。

5.2.5.1 チャンク相互作用ファイル・アダプタ処理

ファイル・アダプタは、チャンク読取り操作のネイティブ・データをXMLに変換し、それをBPEL変数として返します。

チャンク読取りを実行するには、通常、BPEL内にinvokeアクティビティを作成します。

また、ファイル・アダプタ構成ウィザードを使用して、WSDL操作として「チャンク同期読取り」 を選択し、オプションで、構成ウィザードを使用して、ChunkedInteractionSpecに書き込まれるファイル入力ディレクトリおよびファイル名を構成します。

invokeアクティビティがコールされるたびに、ヘッダー値とペイロードが返されます。

これらのヘッダー値には、行番号、列番号、およびファイルの終わりに達したかどうかを示すインジケータが含まれます。以降のファイル・アダプタのコールのために、必ずリターン・ヘッダーの行番号と列番号をアウトバウンド・ヘッダーにコピーしてください。必要に応じて、入力ディレクトリおよびファイル名をヘッダー値として指定することもできます。

5.2.5.1.1 ファイル・チャンク相互作用のBPEL起動

ファイル・アダプタのチャンク相互作用は、BPELから起動されます。ネイティブ・データ・ファイルの場合、行番号と列番号もヘッダー値として渡されます。

ループ内でチャンク相互作用が初めてコールされるときのLineNumberおよびColumnNumberの値は空白であり、それ以降のコールでは、これらの値はinvokeの戻り値から1を引いた値(つまり、invokeの前の値)になります。

BPEL invokeは、表5-3に示されているパラメータを使用してチャンク相互作用をコールします。

表5-3 チャンク相互作用のためのBPEL invokeパラメータ

パラメータ 取得場所

Physical/LogicalDirectory

ChunkedInteractionSpecまたはBPELヘッダー

FileName

ChunkedInteractionSpecまたはBPELヘッダー

ChunkSizeBatchSize

ChunkedInteractionSpec (デバッチ処理におけるPublishSizeと類似)

LineNumber

ヘッダー(オプション)

ColumnNumber

ヘッダー(オプション)

RecordNumber

ヘッダー(オプション)

5.2.5.1.2 ChunkSizeパラメータ

ChunkSizeパラメータは、チャンク読取り操作でのファイル・チャンク・サイズに関連する情報を提供するもので、(ファイル・アダプタ構成ウィザードを使用して) ChunkedInteractionSpec内に別の値を構成していない場合は、デフォルトで1になります。

具体的には、ChunkSizeパラメータは、返されるノードまたはレコード(行ではない)の数を制御します。

たとえば、ネイティブCSVファイルのアドレス帳がある場合、ChunkSizeとして5を指定すると、invokeアクティビティがコールされるたびに、5個のアドレス帳ノードを含むXMLファイル(XMLフォーマットのCSVレコード5行)が返されます。

この意味で、ChunkSizeパラメータは、ファイル・アダプタでインバウンド・トランザクションに使用されるPublishSizeパラメータと似ています。

5.2.5.1.2.1 チャンク読取りのための拒否ハンドラ・バインディングの例

次の例に、チャンク読取り参照バインディングのための拒否ハンドラの構成方法を示します。

例 - チャンク読取りのための拒否ハンドラ・バインディング

<reference name="ReadAddressChunk"> 
    <interface.wsdl 
        interface="http://xmlns.oracle.com/pcbpel/adapter
          /file/ReadAddressChunk/
                #wsdl.interface(ChunkedRead_ptt)"/> 
       <binding.jca config="ReadAddressChunk_file.jca"> 
         <property name="rejectedMessageHandlers" source="" 
              type="xs:string" many="false" override="may"
                >file:///c:/temp</property> 
       </binding.jca> 
  </reference> 
5.2.5.1.2.2 行番号/列番号またはレコード番号の使用

invokeの後は必ず、以降のinvokeのためにリターン・ヘッダーをアウトバウンド・ヘッダーにコピーする必要があります。LineNumber/ColumnNumberはアダプタでブックキーピング目的のみに使用されるものであり、リターン・ヘッダーからこれらの値をチャンク相互作用がコールされる前のヘッダーにコピーする必要があります。

これに対し、RecordNumberは、データが(ネイティブ・データではなく) XMLフォーマットのときに使用されます。その意味で、RecordNumberは、ネイティブ・データのブックキーピングに使用されるLineNumber/ColumnNumberとは相互に排他的です。

5.2.5.1.2.3 ファイル・チャンク読取り相互作用のアーティファクト

次の例は、チャンク読取りのJCAファイルを示しています。

例 - チャンク読取りのためのJCAファイル

<interaction-spec className="oracle.tip.adapter.file.
                 outbound.ChunkedInteractionSpec">
      <property name="PhysicalDirectory"
                     value="/tmp/chunked/in"/>
      <property name="FileName" value="dummy.txt"/>
      <property name="ChunkSize" value="10"/>
    </interaction-spec>

次の例に、チャンク読取り相互作用のために生成されたアダプタWSDLファイルを示します:

例 - チャンク読取りのWSDLファイル

<?xml version = '1.0' encoding = 'UTF-8'?>
<definitions name="ReadAddressChunk"
   targetNamespace="http://xmlns.oracle.com/pcbpel
        /adapter/file/ReadAddressChunk/" 
        xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://xmlns.oracle.com/pcbpel/adapter/
               file/ReadAddressChunk/" xmlns:plt="http://schemas.xmlsoap.org/ws/2003/05/partner-link/" xmlns:imp1="http://xmlns.oracle.com/pcbpel/demoSchema/csv">
    <documentation>Returns a finite chunk from the target 
      file based on the chunk size parameter</documentation>
    <types>
        <schema targetNamespace="http://xmlns.oracle.com/
                  pcbpel/adapter/
             file/ReadAddressChunk/" 
             xmlns="http://www.w3.org/2001/XMLSchema">
            <import namespace="http://xmlns.oracle.com/pcbpel
             /demoSchema/csv" 
               schemaLocation="xsd/address-csv.xsd"/>
              <element name="empty">
                <complexType/>
              </element>
        </schema>
    </types>
    <message name="Empty_msg">
        <part name="Empty" element="tns:empty"/>
    </message>
    <message name="Root-Element_msg">
        <part name=
         "Root-Element" element="imp1:Root-Element"/>
    </message>
    <portType name="ChunkedRead_ptt">
        <operation name="ChunkedRead">
            <input message="tns:Empty_msg"/>
            <output message="tns:Root-Element_msg"/>
        </operation>
    </portType>
    <plt:partnerLinkType name="ChunkedRead_plt">
        <plt:role name="ChunkedRead_role">
            <plt:portType 
             name="tns:ChunkedRead_ptt"/>
        </plt:role>
    </plt:partnerLinkType>
</definitions>
5.2.5.2 ファイル・アダプタ構成ウィザードを使用したチャンク読取り相互作用のモデル化の実行

チャンク読取り相互作用をモデル化するには、ファイル・アダプタ構成ウィザードを使用します。

他のファイル・アダプタ操作を構成する場合と同様、ウィザードの最初の3つの画面を使用できます。

  1. ファイル・アダプタの「操作」画面で、「チャンク読取り」を指定します。

    図5-2 「チャンク読取り」が選択されたファイル・アダプタ構成ウィザードの「操作」ページ

    図5-2の説明が続きます
    「図5-2 「チャンク読取り」が選択されたファイル・アダプタ構成ウィザードの「操作」ページ」の説明
  2. 「ファイル・ディレクトリ」で、チャンク読取り操作のディレクトリ情報を指定します。

    図5-3 ファイル・アダプタ構成ウィザードでのチャンク読取り操作のディレクトリ情報の指定

    図5-3の説明が続きます
    「図5-3 ファイル・アダプタ構成ウィザードでのチャンク読取り操作のディレクトリ情報の指定」の説明
  3. 「ファイル・ディレクトリ」ページで、指定したディレクトリ・パスが物理パスか論理パスかを指定します。ファイルを指定するか、参照してファイルを検索します。チェック・ボックスを選択し、アーカイブ・ファイルの物理パスの名前を示すディレクトリを指定します。デフォルトでは、正常に取得が完了するとファイルが削除されます。「次へ」を選択します。
  4. 「ファイル・アダプタ構成ウィザード」の「ファイル名」ページが表示されます。チャンク読取り操作のファイル名を指定します。「次へ」を選択します。

    図5-4 ファイル・アダプタ構成ウィザードの「ファイル名」ページ

    図5-4の説明が続きます
    「図5-4 ファイル・アダプタ構成ウィザードの「ファイル名」ページ」の説明
  5. ファイル・アダプタ構成ウィザードの「メッセージ」画面が表示されます。

    図5-5 ファイル・アダプタ構成ウィザードの「メッセージ」画面

    図5-5の説明が続きます
    「図5-5 ファイル・アダプタ構成ウィザードの「メッセージ」画面」の説明
  6. ファイル・アダプタ・ウィザードの「メッセージ」画面では、チャンク読取りファイル操作で使用するメッセージを定義できます。ファイルの場所を指定し、着信ファイルに対するメッセージを定義するスキーマ要素を選択します。既存のスキーマ定義を検索するには、参照ボタンを使用します。「スキーマを不透明にする」を選択した場合、スキーマを指定する必要はありません。「次へ」または「終了」を選択して、ファイル・アダプタ構成ウィザードを表示し、チャンク読取りファイル操作に使用するWSDLのディレクトリ・パスと名前を表示します。
5.2.5.2.1 チャンク相互作用のエラー処理の概要

変換例外(nXSD仕様に違反する不正レコード)が発生すると、エラーが発生した行や列などの詳細を含む変換例外メッセージがリターン・ヘッダーに移入されます。

ただし、特定の変換エラーが発生してもフォルトにはなりません。これはリターン・ヘッダー内の値となります。jca.file.IsMessageRejectedおよびjca.file.RejectionReasonヘッダーの値を確認して、拒否が発生したかどうかを確認する必要があります。また、jca.file.NoDataFoundヘッダーの値も確認できます。

5.2.5.2.2 不正なレコードのスキップ

nxsd:uniqueMessageSeparatorコンストラクトを使用すると、アダプタは不正なレコードをスキップして、次のレコード・セットの処理を続行できます。(uniqueMessageSeparatorの詳細は、「ネイティブ・フォーマット・ビルダー・ウィザード」を参照してください。)

uniqueMessageSeparatorを使用しない場合、アダプタはEndOfFileを返し、それによってwhileループが終了します。

このため、ファイルの終わりの状況を想定せずに処理を続行する場合は、uniqueMessageSeparatorコンストラクトが必要です。uniqueMessageSeparatorコンストラクトがない場合、ファイルの残りの部分が単一のチャンクとして拒否され、ファイル全体が拒否されます。

5.2.5.2.3 チャンク相互作用のヘッダーおよび拒否されたチャンク相互作用のメッセージの例

nxsd:uniqueMessageSeparatorコンストラクトを使用するシナリオにおけるリターン・ヘッダーの体裁の例は、図5-6を参照してください。

このシナリオは、(それぞれが複雑である) 6件のレコードを持ち、各代替レコードが不正であったファイルとのチャンク相互作用を示しています。このシナリオでは、ChunkSizeとして5を使用しました。

returnHeaderは、メッセージが拒否されたこと(isMessageRejected=true)、および3つの不正レコードに対して拒否理由が移入される(具体的には行17、37および57のレコードが不正であった)ことを示しています。

NoDataFoundパラメータはfalseに設定されているため、残りの3つのレコードのデータは返されます。

図5-6 nxsd:uniqueMessageSeparatorを使用した場合のリターン・アウトバウンド・ヘッダーの体裁

図5-6の説明が続きます
「図5-6 nxsd:uniqueMessageSeparatorを使用した場合のリターン・アウトバウンド・ヘッダーの体裁」の説明

同じレコードが、ユーザー構成の拒否フォルダ(この場合はC:\foo)に対しても拒否されます。図5-7を参照してください。

図5-7 拒否フォルダ内のチャンク読取り相互作用の拒否メッセージ

図5-7の説明が続きます
「図5-7 拒否フォルダ内のチャンク読取り相互作用の拒否メッセージ」の説明

5.2.6 ファイルのソート

Oracleファイル/FTPアダプタでファイルを特定の順序で処理する必要がある場合は、アダプタのファイル・ソート機能を使用できます。たとえば、Oracleファイル/FTPアダプタのソート・パラメータは、ファイルをタイムスタンプの昇順または降順で処理するように構成できます。

Oracleファイル/FTPアダプタを使用してBPELプロセスをトリガーする場合は、BPELプロセスを同期プロセスとして構成します。構成するには、<property name="bpel.config.oneWayDeliveryPolicy" type="xs:string" many="false">sync</property>composite.xmlに追加します。これにより、Oracleファイル/FTPアダプタにより開始されたスレッドと同じスレッドでBPELが実行され、BPELでも指定された順序でファイルが処理されます。BPELがブレークポイント・アクティビティに遭遇しないようにしてください。BPELインスタンスが、waitreceiveonMessageonAlarm、非同期WSDLのコールなど、中間プロセス・ブレークポイント・アクティビティ(最初のreceiveは含まない)に遭遇すると、BPELインスタンスがデハイドレーション(データベースに保存)され、個別のスレッドが開始します。これは、既存のBPELインスタンスのイベント(タイマーの期限切れまたはメッセージ受信など)の待機として発生し、イベント(アラームの期限切れまたはメッセージ受信)が発生すると、インスタンスがデハイドレーション・ストアからロードされて実行が再開します。

Oracleファイル/FTPアダプタのソート・シナリオの場合、次の前提条件を満たす必要があります。

  • 同期操作の使用

  • インバウンドJCAファイルへの次のプロパティの追加

    <property name="ListSorter" 
    value="oracle.tip.adapter.file.inbound.listing.TimestampSorterAscending"/> 
    <property name="SingleThreadModel" value="true"/>
    

5.2.7 動的アウトバウンド・ディレクトリとファイル名の指定

Oracleファイル/FTPアダプタでは、アウトバウンド・ファイルやアウトバウンド・ディレクトリの論理名または物理名を動的に指定できます。動的なアウトバウンド・ディレクトリを指定する方法は、「アウトバウンド・ファイル・ディレクトリの作成」を参照してください。

5.2.8 セキュリティ

Oracle FTPアダプタはFTP Over SSL (FTPS)とセキュアFTP (SFTP)をサポートしており、ネットワークを介したセキュアなファイル転送が可能です。

詳細は、Oracle FTPアダプタでのセキュアFTPの使用およびOracle FTPアダプタでのSFTPの使用を参照してください。

5.2.9 非トランザクション

Oracleファイル・アダプタはインバウンド・ディレクトリからファイルを取得して処理し、処理したファイルを出力ディレクトリに送信します。ただし、Oracleファイル・アダプタには非トランザクションの性質があるため、このプロセス中にOracle RACバックエンドまたはSOA管理対象サーバーでフェイルオーバーが発生すると、ファイルが2回処理されます。その結果、出力ディレクトリにファイルが重複して存在する場合があります。

5.2.10 プロキシのサポート

Oracle FTPアダプタのプロキシ・サポート機能を使用すると、ファイアウォール外部のFTPサーバーやプロキシ・サーバーを介してのみアクセス可能なFTPサーバーとの間でデータを転送および取得できます。プロキシ・サーバーにより、イントラネット上のホストからインターネット上のホストに間接的に接続できます。図5-8に、プロキシ・サーバーが接続を作成してクライアントとリモートFTPサーバーとの直接接続をシミュレートする様子を示します。

図5-8 プロキシ・サーバーを介したリモートFTPサーバー接続

図5-8の説明が続きます
「図5-8 プロキシ・サーバーを介したリモートFTPサーバー接続」の説明

HTTPプロキシ機能を使用するには、プロキシ・サーバーでHTTP接続を介したFTP通信量をサポートしている必要があります。また、この機能でサポートされるのはパッシブ・データ接続のみです。Oracle FTPアダプタの構成方法は、「HTTPプロキシ用の構成」を参照してください。

5.2.11 ペイロード以外のサポート

Oracle BPEL PMおよびメディエータの場合、Oracleファイル/FTPアダプタは、BPELプロセスやメディエータに対するファイル名、ディレクトリ、ファイル・サイズ、最終変更時間などのファイル・メタデータのみのパブリッシュをサポートしており、ペイロードは除外されます。このプロセスでは、このメタデータを以降の処理に使用できます。たとえば、プロセスで別の参照をコールし、以降の処理のためにファイル名とディレクトリ名を渡すことができます。Oracleファイル/FTPアダプタを通知サービスとして使用し、インバウンド・ディレクトリに新規ファイルが出現するたびにプロセスに通知できます。この機能を使用するには、読取り操作の構成時にJDeveloperウィザードで「ファイルの内容を読み取らない」チェック・ボックスを選択します。

5.2.12 大きなペイロードのサポート

Oracle BPEL PMおよびメディエータの場合、Oracleファイル・アダプタは大きいファイルを添付として転送する機能をサポートしています。この機能を使用するには、読取り操作の構成時にJDeveloperの構成ウィザードで「ファイルを添付として読取り」チェック・ボックスを選択します。

このオプションを選択すると、ある場所から別の場所へ大量のデータが添付として不透明に転送されます。たとえば、大量のMS Word文書、イメージおよびPDFをコンポジット・アプリケーション内でコンテンツを処理せずに転送できます。大きなペイロードを添付として渡す方法は、「添付としてのRead File」を参照してください。

さらに、Oracleファイル・アダプタにより、ファイルを添付として書き込む機能が提供されます。ファイルを添付ファイルとして書き込むときに標準ペイロードも所有している場合は、添付ファイルが書き込まれ、ペイロードは無視されます。

ノート:

大きなペイロードを不透明スキーマとして渡すことはできません。

5.2.13 ファイルベースのトリガー

Oracleファイル/FTPアダプタは、インバウンド・アダプタのエンドポイントのアクティブ化の制御に使用可能なファイルベースのトリガーをサポートしています。ファイルベースのトリガーの使用方法は、「ファイル・ポーリング」を参照してください。

5.2.14 ファイルの前処理および後処理

プロセス・モデラーでは、処理のためにファイルを取得する前に前処理を行ったり、宛先フォルダにファイルを書き出す前に後処理を行う必要がある状況が発生する場合があります。たとえば、Oracleファイル/FTPアダプタで受信されたファイルは圧縮または暗号化される可能性があるため、ファイルを処理する前に、アダプタでファイルを解凍または復号化する必要があります。この場合、カスタム・コードを使用して、ファイルを処理する前に解凍または復号化する必要があります。Oracleファイル/FTPアダプタでは、ファイルの前処理や後処理のためにプラグインできるカスタム・コードの使用がサポートされています。

ファイルの前処理および後処理の実装は、Oracleファイル/FTPアダプタの次の通信モードに制限されています。

  • Read FileまたはGet File

  • Write FileまたはPut File

  • 同期Read File

  • チャンク読取り

この項では、次の項目について説明します。

5.2.14.1 ファイルの前処理および後処理のメカニズム

ファイルの前処理および後処理のメカニズムは、パイプラインおよびバルブとして構成されます。この項では、パイプラインおよびバルブについて説明します。

パイプラインには、カスタム定義された一連のバルブが含まれます。ファイル・システムからパイプラインにロードされたストリームは、順序付けられた一連のバルブによって処理され、処理の後に、変更されたストリームがアダプタに返されます。

バルブは、パイプライン処理における主要な実行コンポーネントです。バルブでは、受信したコンテンツを処理して、処理済のコンテンツを次のバルブに転送します。たとえば、暗号化され、かつ圧縮されたファイルをOracleファイル/FTPアダプタで受信するというシナリオでは、解凍バルブの後に復号化バルブを使用するパイプラインを構成できます。図5-9に示すように、ファイル・コンテンツは解凍バルブで解凍された後、復号化バルブに転送され、復号化バルブで復号化されて、最終的なコンテンツがOracleファイル/FTPアダプタで使用できるようになります。

図5-9 サンプルの前処理パイプライン

図5-9の説明が続きます
「図5-9 サンプルの前処理パイプライン」の説明
5.2.14.2 パイプラインの構成

ファイルの前処理および後処理のメカニズムを構成するには、パイプラインを定義して、対応するJCAファイルでパイプラインを構成する必要があります。

パイプラインを構成するステップは、次のとおりです。

5.2.14.2.1 バルブの実装および拡張
  • すべてのバルブにValveまたはStagedValveインタフェースを実装する必要があります。

    ヒント:

    バルブを最初から実装するかわりに、ビジネス要件に応じてAbstractValveクラスまたはAbstractStagedValveクラスのいずれかを拡張できます。

    次の例に、サンプルのValveインタフェースを示します。

    例 - Valveインタフェース

    package oracle.tip.pc.services.pipeline;
     
    import java.io.IOException;
    /** <p>
     *  Valve component is resposible for processing the input stream
     *  and returning a modified input stream. 
     *  The <code>execute()</code> method of the valve gets invoked
     *  by the caller (on behalf) of the pipeline. This method must 
     *  return the input stream wrapped within an InputStreamContext.
     *  The Valve is also responsible for error handling specifically
     *  
     *  The Valve can be marked as reentrant in which case the caller
     *  must call the <code>execute()</code> multiple times and each
     *  invocation must return a new input stream. This is useful, if
     *  you are writing an UnzipValve since each iteration of the valve
     *  must return the input stream for a different zipped entry. 
     *  <b> You must note that only the first Valve in the pipeline can
     *  be reentrant </b>
     *  
     *  The Valve has another flavor <code>StagedValve</code> and if 
     *  the valve implements StagedValve, then the valve must store
     *  intermediate content in a staging file and return it whenever
     *  required.
     * </p>
     */
    public interface Valve
    {
        /**
         * Set the Pipeline instance. This parameter can be
         * used to get a reference to the PipelineContext instance. 
         * @param pipeline
         */
        public void setPipeline(Pipeline pipeline);
     
        /** Returns the Pipeline instance.
           * @return
           */
          public Pipeline getPipeline();
          
          /** Returns true if the valve has more input streams to return
           *  For example, if the input stream is from a zipped file, then
           *  each invocation of <code>execute()</code> returns a different
           *  input stream once for each zipped entry. The caller calls 
           *  <code>hasNext()</code> to check if more entries are available
           * @return true/false
           */
          public boolean hasNext();
          
          /** Set to true if the caller can call the valve
               multiple times
           *  e.g. in case of ZippedInputStreams
           * @param reentrant
           */
          public void setReentrant(boolean reentrant);
     
          /** Returns true if the valve is reentrant.
         * @return
         */
        public boolean isReentrant();
        
        /** The method is called by pipeline to
            return the modified input stream
         * @param in
         * @return InputStreamContext that wraps 
         * the input stream along with required metadata 
         * @throws PipelineException
         */
        public InputStreamContext execute(InputStreamContext
             in) throws 
                PipelineException, IOException;
        
          /**
           * This method is called by the pipeline after the caller 
           * publishes the 
           * message to the SCA container. 
           * In the case of a zipped file, this method 
           * gets called repeatedly, once
           * for each entry in the zip file.
           * This should be used by the Valve to do 
           * additional tasks such as
           * delete the staging file that has been processed 
           * in a reentrant 
           * scenario.
           * @param in The original InputStreamContext returned from 
    <code>execute()</code>
           */
          public void finalize(InputStreamContext in);
     
        /**Cleans up intermediate staging files, input streams
         * @throws PipelineException, IOException
         */
        public void cleanup() throws PipelineException, IOException;
     }
    

    StagedValveには、ステージング・ファイルの中間コンテンツが格納されます。次の例に、Valveインタフェースを拡張するStagedValveインタフェースを示します。

    例 - Valveインタフェースを拡張するStagedValveインタフェース

    package oracle.tip.pc.services.pipeline;
     
    import java.io.File;
     
    /**
     * A special valve that stages the modified
     * input stream in a staging file.
     * If such a <code>Valve</code> exists, then
     * it must return the staging file containing 
     * the intermediate data.
     */
    public interface StagedValve extends Valve {
          
          /**
           * @return staging file where the valve 
           * stores its intermediate results
           */
          public File getStagingFile();
    }
    

    次の例に、Valveインタフェースを実装するAbstractValveクラスのサンプルを示します。

    例 - Valveインタフェースを実装するAbstractValveインタフェース

    package oracle.tip.pc.services.pipeline;
     
    import java.io.IOException;
     
    /**
     * A bare bone implementation of Valve. The user should 
     * extend from
     * AbstractValve rather than implementing a Valve from scratch
     * 
     */
    public abstract class AbstractValve implements Valve {
     
          /**
           * The pipeline instance is stored as a member
           */
          private Pipeline pipeline = null;
     
          /**
           * If reentrant is set to true, then the Valve must adhere to the 
    following:
           * i) It must the first valve in the pipeline ii)
           *  Must implement hasNext
           * method and return true if more input
           * streams are available A reentrant
           * valve will be called by the pipeline
           * more than once and each time the
           * valve must return a different input stream, 
           * for example Zipped entries 
           * within a zip file
           */
          private boolean reentrant = false;
     
          /*
           * Save the pipeline instance.
           * 
           * @see 
           * oracle.tip.pc.services.pipeline.Valve#setPipeline
           * (oracle.tip.pc.services.pipeline.Pipeline)
           */
          public void setPipeline(Pipeline pipeline) {
                this.pipeline = pipeline;
          }
     
          /*
           * Return the pipeline instance (non-Javadoc)
           * 
           * @see oracle.tip.pc.services.pipeline.
           * Valve#getPipeline()
           */
          public Pipeline getPipeline() {
                return this.pipeline;
          }
     
          /*
           * Return true if the valve is reentrant (non-Javadoc)
           * 
           * @see oracle.tip.pc.services.pipeline.
           * Valve#isReentrant()
           */
          public boolean isReentrant() {
                return this.reentrant;
          }
     
          /*
           * If set to true, the valve is reentrant (non-Javadoc)
           * 
           * @see oracle.tip.pc.services.pipeline.
           * Valve#setReentrant(boolean)
           * 
           */
          public void setReentrant(boolean reentrant) {
                this.reentrant = reentrant;
          }
     
          /*
           * By default, set to false For valves 
           * that can return more than one
           * inputstreams to callers, this parameter
           *  must return true/false depending
           * on the availability of input streams (non-Javadoc)
           * 
           * @see oracle.tip.pc.services.pipeline.Valve#hasNext()
           */
          public boolean hasNext() {
                return false;
          }
     
          /*
           * Implemented by concrete valve (non-Javadoc)
           * 
           * @see oracle.tip.pc.services.pipeline.
           * Valve#execute(InputStreamContext)
           */
          public abstract InputStreamContext 
                 execute(InputStreamContext in)
                      throws PipelineException, IOException;
     
          /*
           * Implemented by concrete valve (non-Javadoc)
           * 
           * @see 
           *       oracle.tip.pc.services.pipeline.Valve#finalize
           *       (oracle.tip.pc.services.pipeline.In
           *                      putStreamContext)
           *        /
          public abstract void finalize(InputStreamContext in);
     
          /*
           * Implemented by concrete valve (non-Javadoc)
           * 
           * @see oracle.tip.pc.services.pipeline.
           * Valve#cleanup()
           */
          public abstract void cleanup() 
                  throws PipelineException, IOException;
     
    }
    

    次の例に、AbstractValveクラスを拡張するAbstractStagedValveクラスを示します。

    例 - AbstractValveクラスを拡張するAbstractStagedValveクラス

    package oracle.tip.pc.services.pipeline;
     
    import java.io.File;
    import java.io.IOException;
     
    public abstract class AbstractStagedValve
               extends AbstractValve implements
                StagedValve {
     
          public abstract File getStagingFile();
     
          public abstract void cleanup() throws IOException, 
                  PipelineException;
     
          public abstract InputStreamContext 
                        execute(InputStreamContext in)
                      throws IOException, PipelineException;
     
    }
    

    バルブの詳細は、「Oracle JCAアダプタ・バルブ」を参照してください。

5.2.14.2.2 バルブのコンパイル
  • バルブをコンパイルするには、bpm-infra.jarファイルを使用する必要があります。bpm-infra.jarファイルは、$MW_HOME/AS11gR1SOA/soa/modules/oracle.soa.fabric_11.1.1/bpm-infra.jarにあります。

    1. bpm-infra.jarファイルに対するSOAプロジェクトを参照するには、次の手順を使用します。

      1. 「アプリケーション・ナビゲータ」で、SOAプロジェクトを右クリックします。

      2. 「プロジェクト・プロパティ」を選択します。「プロジェクト・プロパティ」ダイアログが表示されます。

      3. 「ライブラリとクラスパス」をクリックします。図5-10に示すように、「ライブラリとクラスパス」ペインが表示されます。

        図5-10 「プロジェクト・プロパティ」ダイアログ

        図5-10の説明が続きます
        「図5-10 「プロジェクト・プロパティ」ダイアログ」の説明
      4. 「Jar/ディレクトリの追加」をクリックします。「アーカイブまたはディレクトリの追加」ダイアログが表示されます。

      5. 参照してbpm-infra.jarファイルを選択します。Bpm-infra.jarファイルは、$MW_HOME/AS11gR1SOA/soa/modules/oracle.soa.fabric_11.1.1/bpm-infra.jarにあります。

      6. 「OK」をクリックします。bpm-infra.jarファイルが「クラスパス・エントリ」に表示されます。

    2. bpm-infra.jarファイルを使用してバルブをコンパイルします。

    3. コンパイルされたバルブを含むJARファイルをsoainfraドメインのクラスパスに追加して、Oracle WebLogic Serverクラスパスで使用できるようにします。たとえば、$MW_HOME/user_projects/domains/soainfra/libなどです。

    ノート:

    「クラス・ファイルのバージョン50.0が正しくありません。49.0である必要があります。」などのコンパイル・エラーを回避するには、JDK 6.0を使用してbpm-infra.jarをコンパイルするようにしてください。

5.2.14.2.3 パイプラインの作成
  • パイプラインを構成するには、次のスキーマに準拠するXMLファイルを作成する必要があります。

    例 - パイプライン作成のためのXML

    <?xml version="1.0" encoding="UTF-8" ?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.oracle.com/adapter/pipeline">  
      <xs:element name="pipeline">    
        <xs:complexType> 
          <xs:sequence>        
            <xs:element ref="valves">            
              <xs:complexType>                      
                <xs:sequence>                             
                  <xs:element ref="valve"
                           maxOccurs="unbounded">
                    <xs:complexType mixed="true">                                        
                    <xs:attribute name="reentrant"
                       type="xs:NMTOKEN" 
                             use="optional" />
                    </xs:complexType>                              
                  </xs:element>                       
                </xs:sequence>            
              </xs:complexType>
            </xs:element>      
          </xs:sequence>    
        </xs:complexType>      
        <xs:attribute name="useStaging" 
                  type="xs:NMTOKEN" use="optional" />      
        <xs:attribute name="batchNotificationHandler"
                type="xs:NMTOKEN" use=" 
    optional" />    
      </xs:element>
    </xs:schema          
       

    パイプラインに対してSimpleUnzipValveおよびSimpleDecryptValveの2つのバルブを使用して構成したサンプルのXMLファイルを次に示します。

    例 - パイプラインに対して2つのバルブを使用して構成したXMLファイル

    <?xml version="1.0"?>
    <pipeline xmlns=
              "http://www.oracle.com/adapter/pipeline">
    <valves>
            <valve>valves.SimpleUnzipValve</valve>
            <valve> valves.SimpleDecryptValve </valve>
    </valves>
    </pipeline>
    
5.2.14.2.4 SOAプロジェクト・ディレクトリへのパイプラインの追加
  • pipeline.xmlファイルをSOAプロジェクト・ディレクトリに追加する必要があります。パイプラインをOracleファイル/FTPアダプタと統合するには、このステップが必須です。図5-11に、InboundUnzipAndOutboundZipプロジェクトに追加されたサンプルのpipeline.xmlファイル(unzippipeline.xml)を示します。

    図5-11 unzippipeline.xmlファイルを含むプロジェクト

    図5-11の説明が続きます
    「図5-11 unzippipeline.xmlファイルを含むプロジェクト」の説明
5.2.14.2.5 パイプラインの登録
  • SOAプロジェクトの一部であるパイプラインは、次のプロパティを追加してインバウンドJCAファイルを変更することにより登録する必要があります。

    <property name="PipelineFile" value="pipeline.xml"/>
    

    ノート:

    pipeline.xmlファイルをcomposite.xmlと同じディレクトリに配置するか、.jcaファイルが配置されているadaptersサブディレクトリに配置します。

    たとえば、図5-11に示すように、JCAファイル(FileInUnzip_file.jca)には、UnzipパイプラインをOracleファイル・アダプタに登録するために次のプロパティが追加されています。

    <property name="PipelineFile" value="unzippipeline.xml"/>
    

    単純なバルブを使用したシナリオがある場合もあります。単純なバルブとは、リエントラント性などの追加メタデータやbatchNotificationHandlersを必要としないバルブのことです。単純なバルブを使用するシナリオの場合、パイプラインは、次のサンプルに示すようにActivationSpecまたはInteractionSpecプロパティとして構成できます。

    例 - 単純なバルブを使用したパイプライン構成

    <?xml version="1.0" encoding="UTF-8"?>
    <adapter-config name="FlatStructureIn"
                     adapter="File Adapter" 
    xmlns="http://platform.integration.
                  oracle/blocks/adapter/fw/metadata">
      
      <connection-factory location="eis/FileAdapter" 
                   UIincludeWildcard="*.txt" 
    adapterRef=""/>
      <endpoint-activation operation="Read">
        <activation-spec 
    className="oracle.tip.adapter.file.
                         inbound.FileActivationSpec">
          <property name="UseHeaders" value="false"/>
          <property name=
                  "LogicalDirectory" value="InputFileDir"/>
          <property name="Recursive" value="true"/>
          <property name="DeleteFile" value="true"/>
          <property name="IncludeFiles" value=".*\.txt"/>
          <property name="PollingFrequency" value="10"/>
          <property name="MinimumAge" value="0"/>
          <property name="OpaqueSchema" value="false"/>
        </activation-spec>
      </endpoint-activation>
     
    </adapter-config>
    

    ノート:

    PipelineValvesプロパティのvalueには、カンマ(,)の後にスペースはありません。

    ノート:

    PipelineValveプロパティを使用してパイプラインを構成する場合、リエントラント・バルブやバッチ通知ハンドラなどの追加メタデータは構成できません。追加メタデータは、XMLベースのアプローチに使用されるPipelineFileを使用する場合にのみ構成できます。

5.2.14.3 Zipファイルに対するリエントラント・バルブの使用

リエントラント・バルブを使用すると、Zipファイル内の個別エントリを処理できます。Zipファイル内のすべてのエントリを処理するシナリオでは、各エントリがData Encryption Standard (DES)を使用して暗号化されますが、reentrant="true"属性を解凍バルブに次のように追加することにより、バルブを構成できます。

例 - reentrant=true属性の構成

<?xml version="1.0"?>
<pipeline xmlns="http://www.oracle.com/adapter/pipeline">
<valves>
        <valve reentrant="true">valves.ReentrantUnzipValve</valve>
        <valve> valves.SimpleDecryptValve </valve>
</valves>
</pipeline>

この例では、Zipファイル全体が処理されるまで、パイプラインによってReentrantUnzipValveの次にSimpleDecryptValveが同じ順序で繰り返し起動されます。つまり、まずReentrantUnzipValveが起動されて圧縮された最初のエントリのデータを返し、次に、そのエントリがSimpleDecryptValveに送られて復号化され、最終的なコンテンツがアダプタに返されます。このプロセスが、Zipファイル内のすべてのエントリが処理されるまで繰り返されます。

また、バルブにはsetMessageKey() APIを使用してメッセージ・キーを設定する必要があります。詳細は、「複数ファイルの処理用の解凍バルブ」を参照してください。

ノート:

<FMWHome>/soa/soa/modules/oracle.rules.thirdparty_12.1.2/poi-ooxml-schemas-3.7.jarが存在することを確認してください。

Zipファイルのエラー処理

Zipファイル内の個別のエントリに対する変換エラーがある場合、変換エラーのあるエントリは拒否され、他のエントリが処理されます。

パブリッシュ操作中のエラーがある場合、パブリッシュ操作は再試行され、再試行セマンティックが保持されます。再試行セマンティックが保持されない場合、元のファイルが拒否されてパイプラインは終了します。

5.2.14.4 バッチ通知ハンドラの構成

BatchNotificationHandler APIは、Oracleファイル/FTPアダプタのインバウンドのデバッチ機能とともに使用されます。デバッチ・シナリオでは各ファイルに複数メッセージが含まれ、クラッシュ・リカバリに対するなんらかのブックキーピングが必要となります。このことはBatchNotificationHandler APIによって容易になります。このAPIによりバッチが開始、発生または終了するたびにパイプラインから通知を受け取ります。次の例に、BatchNotificationHandlerインタフェースを示します。

例 - BatchNotificationハンドラ

package oracle.tip.pc.services.pipeline;
 
/*
 * Whenever the caller processes de-batchable files,
 * each file can
 * have multiple messages and this handler
 * allows the user to plug in
 * a notification mechanism into the pipeline.
 * 
 * This is particularly useful in crash recovery 
 * situations
 */
 public interface BatchNotificationHandler {
 
      /*
       * The Pipeline instance is set by the 
       * PipelineFactory when the
       * BatchNotificationHandler instance is created
       */
      public void setPipeline(Pipeline pipeline);
 
      public Pipeline getPipeline();
      /*
       * Called when the BatchNotificationHandler 
       * is instantiated
       */
        
      public void initialize();
      /*
       * Called by the adapter when a batch begins,
       * the implementation must 
       * return
         * a BatchContext instance with the 
         * following information:
         * i) batchId: a unique 
         * id that will be returned 
         * every time onBatch is 
         * invoked by called
         * ii)line/col/record/offset:
         * for error recovery cases
       */
      public BatchContext onBatchBegin();
 
      /*
       * Called by the adapter
       * when a batch is submitted. 
       * The parameter holds the 
       * line/column/record/offset for the successful batch
       * that is published.
       * Here the implementation 
       * must save these in 
       * order to recover from 
       * crashes
       */
 
      public void onBatch(BatchContext ctx);
 
      /*
       * Called by the adapter when a batch 
       * completes.
      * This must be used to clean up
       */
      public void onBatchCompletion
           (boolean success);
}

デバッチ処理を含むパイプラインを使用するには、BatchNotificationHandlerインスタンスを使用したパイプラインを構成する必要があります。次の例を参照してください。

例 - BatchNotificationHandlerインスタンスを使用したパイプラインの構成

<?xml version="1.0"?>
<pipeline xmlns="http://www.oracle.com
           /adapter/pipeline" batchNotificationHandler="oracle.tip.pc.services.                  pipeline.ConsoleBatchNotificationHandler">
<valves>
      <valve reentrant="true">valves.
                  SimpleUnzipValve</valve>
      <valve>valves.SimpleDecryptValve</valve>
</valves>
</pipeline>

5.2.15 エラー処理

Oracleファイル・アダプタOracle FTPアダプタには、uniqueMessageSeparatorプロパティなどのインバウンド・エラー処理機能が用意されています。

デバッチ処理(1つのファイルに複数のメッセージがある場合)では、不正メッセージの開始部分からファイルの終わりまでが拒否されます。各メッセージに一意のセパレータがあり、そのセパレータがいずれのデータの一部でもない場合、拒否される部分はより細かくなります。その場合、ネイティブ・スキーマのスキーマ要素にuniqueMessageSeparatorプロパティを定義し、この一意のメッセージ・セパレータの値を取得できます。1つのファイル内の複数レコードの解析(デバッチ処理)中、このプロパティがアダプタ・トランスレータの動作を制御します。このプロパティを使用することにより、大きなバッチ・ファイルに不正メッセージが検出された場合でもリカバリが可能になります。不正レコードが検出されると、アダプタ・トランスレータは次の一意のメッセージ・セパレータ境界にスキップし、そこから続行します。このプロパティを設定しないと、不正レコード以降のすべてのレコードが拒否されます。

次の例に、uniqueMessageSeparatorプロパティの使用例を示します。

例 - uniqueMessageSeparatorプロパティの使用方法を示すスキーマ・ファイル

<?xml version="1.0" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/
                  2001/XMLSchema"
            xmlns:nxsd="http://xmlns.oracle.com/
                         pcbpel/nxsd"
            targetNamespace=
                  "http://TargetNamespace.com/Reader"
            xmlns:tns=
                "http://TargetNamespace.com/Reader"
            elementFormDefault="qualified" 
                 attributeFormDefault="unqualified"
            nxsd:encoding="US-ASCII" nxsd:stream="chars" 
            nxsd:version="NXSD" 
                nxsd:uniqueMessageSeparator="${eol}">
  <xsd:element name="emp-listing">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="emp" minOccurs="1"
                          maxOccurs="unbounded">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="GUID" 
                           type="xsd:string" 
                           nxsd:style="terminated"
                           nxsd:terminatedBy="," 
                           nxsd:quotedBy="&quot;">
              </xsd:element>
              <xsd:element name="Designation" 
                           type="xsd:string"
                           nxsd:style="terminated" 
                           nxsd:terminatedBy=","
                           nxsd:quotedBy="&quot;">
              </xsd:element>
              <xsd:element name="Car" type="xsd:string" 
                           nxsd:style="terminated"
                           nxsd:terminatedBy="," 
                           nxsd:quotedBy="&quot;">
              </xsd:element>
              <xsd:element name="Labtop" type="xsd:string"
                           nxsd:style="terminated"
                           nxsd:terminatedBy=","
                           nxsd:quotedBy="&quot;">
              </xsd:element>
              <xsd:element name="Location" 
                              type="xsd:string"
                           nxsd:style="terminated" 
                                 nxsd:terminatedBy=","
                           nxsd:quotedBy="&quot;">
              </xsd:element>
            </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>
<!--NXSDWIZ:D:\work\jDevProjects\Temp_BPEL_process
                 \Sample2\note.txt:-->
<!--USE-HEADER:false:-->

拒否されたメッセージ、接続エラーおよびメッセージ・エラーの処理の詳細は、「拒否されたメッセージの処理」を参照してください。

5.2.15.1 不正な形式のXMLファイルのローカル・ファイル・システム・フォルダへの送信

インバウンド読取りの操作中、不正な形式のXMLファイルが読み取られるとエラーが発生します。エラーになったファイルは、デフォルトでリモート・ファイル・システムに送信されてアーカイブされます。

エラー・ファイルをローカル・ファイル・システムでアーカイブするには、jcaファイル内でuseRemoteErrorArchiveプロパティを指定し、そのプロパティをfalseに設定します。

このプロパティのデフォルト値はtrueです。

5.2.16 スレッド・モデル

この項では、Oracleファイル/FTPアダプタがサポートするスレッド・モデルについて説明します。Oracleファイル/FTPアダプタを抑制または抑制解除するには、スレッド・モデルの知識が必要です。Oracleファイル/FTPアダプタでは、次のスレッド・モデルを使用します。

5.2.16.1 デフォルトのスレッド・モデル

デフォルトのスレッド・モデルでは、インバウンドのOracleファイル/FTPアダプタの各エンドポイントに対してポーラーが作成されます。ポーラーは、ファイル・メタデータをインメモリー・キューにエンキューします。このファイル・メタデータはプロセッサ・スレッドのグローバル・プールによって処理されます。図5-12はデフォルトのスレッド・モデルを示しています。

図5-12 デフォルトのスレッド・モデル

図5-12の説明が続きます
「図5-12 デフォルトのスレッド・モデル」の説明

次のステップで、デフォルトのスレッド・モデルの機能を明確に示します。

  1. ポーラーは、入力ディレクトリ内のファイルを定期的に検索します。ポーラーがファイルを検索する間隔は、インバウンドJCAファイルのPollingFrequencyパラメータで指定されます。

  2. ポーラーは、構成済のインバウンド・ディレクトリで検出した新規ファイルごとに、ファイル名、ファイル・ディレクトリ、変更時間、ファイル・サイズなどの情報を内部のインメモリー・キューにエンキューします。

    ノート:

    新規ファイルとは処理されていないファイルです。

  3. プロセッサ・ワーカー・スレッドのグローバル・プールは、インメモリー・キューのファイルの処理を待機します。

  4. プロセッサ・ワーカー・スレッドは内部キューからファイルを取得し、次のアクションを実行します。

    1. 適切なトランスレータ(テキスト、バイナリ、XMLまたは不透明データを読み取るトランスレータなど)にファイルの内容をストリームします。

    2. トランスレータによるXMLの結果をSCAインフラストラクチャにパブリッシュします。

    3. ファイル処理後の削除やアーカイブなど、必要な後処理を実行します。

5.2.16.2 変更されたスレッド・モデル

Oracleファイル/FTPアダプタのデフォルトのスレッド動作を変更できます。スレッド・モデルを変更すると、Oracleファイル/FTPアダプタの抑制動作が変更されます。以降の各項では、Oracleファイル/FTPアダプタの変更されたスレッド動作について説明します。

5.2.16.2.1 シングル・スレッド・モデル

シングル・スレッド・モデルは、ポーラーがプロセッサの役割を果たせるようにする、変更されたスレッド・モデルです。ポーラー・スレッドは、同じスレッド内のファイルを処理します。このモデルでは、プロセッサ・スレッドのグローバル・プールは使用されません。シングル・スレッド・モデルのプロパティは、インバウンドJCAファイルで次のように定義できます。

例 - シングル・スレッド・モデルのプロパティの定義

<activation-spec className="oracle.tip.adapter.file.
   inbound.FileActivationSpec">
   <property../>
   <property name="SingleThreadModel" value="true"/>
   <property../>
</activation-spec>
5.2.16.2.2 パーティション化スレッド・モデル

パーティション化スレッド・モデルは、インメモリー・キューがパーティション化され、各コンポジット・アプリケーションがそれぞれのインメモリー・キューを取得する、変更されたスレッド・モデルです。Oracleファイル/FTPアダプタは、プロセッサ・ワーカー・スレッドのグローバル・プールに依存しないで独自のプロセッサ・スレッドを作成し、エンキューされたファイルを処理できます。パーティション・モデルのプロパティは、インバウンドJCAファイルで定義できます。次の例を参照してください。

例 - インバウンドJCAファイルでのパーティション・モデルのプロパティの定義

<activation-spec 
className="oracle.tip.adapter.file.inbound.
   FileActivationSpec">
  <property../>
  <property name="ThreadCount" value="4"/>
  <property../>
</activation-spec>

この例で、パーティション・モデルのプロパティ定義は次のようになります。

  • ThreadCountプロパティが0に設定されている場合、スレッド動作はシングル・スレッド・モデルと同様になります。

  • ThreadCountプロパティが-1に設定されている場合、グローバル・スレッド・プールが使用され、動作はデフォルトのスレッド・モデルと同じになります。

  • ThreadCountプロパティの最大値は40です。

5.2.17 パフォーマンス・チューニング

Oracleファイル/FTPアダプタでは、インバウンド操作とアウトバウンド操作を抑制するためのノブを提供することでパフォーマンス・チューニング機能をサポートしています。Oracleファイル/FTPアダプタでは、アウトバウンド操作のパフォーマンス・チューニングに使用できるパラメータも提供されます。

パフォーマンス・チューニングの詳細は、このマニュアルの「Oracle JCAアダプタ・チューニング・ガイド」を参照してください。

5.2.18 高可用性

Oracleファイル/FTPアダプタは、Oracle BPEL Process Managerおよびメディエータ・サービス・エンジンでのアクティブ/アクティブ・トポロジに対する高可用性機能をサポートしています。この機能は、インバウンド操作とアウトバウンド操作の両方でサポートされています。

5.2.19 複数のディレクトリ

Oracleファイル/FTPアダプタは、1つのアクティブ化における複数ディレクトリのポーリングをサポートしています。JDeveloperで単一ディレクトリではなく複数のディレクトリを指定できます。これは、物理ディレクトリと論理ディレクトリの両方に適用可能です。

ノート:

インバウンドのOracleファイル・アダプタが着信ファイルを複数のディレクトリでポーリングするように構成されている場合は、ファイル・リーダーがこれらのディレクトリのポーリングを開始する前に、すべての最上位ディレクトリ(入力ファイルが表示されるインバウンド・ディレクトリ)が存在している必要があります。

1つ以上のインバウンド・ディレクトリを選択した後、サブディレクトリの再帰的な処理が必要かどうかも指定できます。「ファイルを再帰的に処理します」オプションを選択した場合は、ディレクトリが再帰的に処理されます。図5-13に示すように、デフォルトでは、このオプションが「ファイル・ディレクトリ」ページで選択されます。

複数のディレクトリを選択した場合、生成されるJCAファイルではディレクトリのセパレータとしてセミコロン(;)が使用されます。ただし、他のセパレータへの変更も可能です。その場合は、生成されたJCAファイルに手動でDirectorySeparator="選択したセパレータ"を追加します。たとえば、セパレータとしてカンマ(,)を使用する場合は、まず物理ディレクトリ内でセパレータを","に変更してから、JCAファイルに<property name="DirectorySeparator" value=","/>を追加します。

さらに、ディレクトリを再帰的に処理し、1つ以上のサブディレクトリに適切な権限がない場合、インバウンド・アダプタは処理時に例外をスローします。この例外を無視する場合は、次の例に示すようにcomposite.xmlignoreListingErrorsの名前を持つバインディング・プロパティを定義する必要があります。

例 - ignoreLIstingErrorsという名前のバインディング・プロパティの定義

<service name="FlatStructureIn">
<interface.wsdl 
interface="http://xmlns.oracle.com/
       pcbpel/adapter/file/
       FlatStructureIn/#wsdl.inte
rface(Read_ptt)"/>
<binding.jca config="FlatStructureIn_file.jca">
<property name="ignoreListingErrors" 
                    type="xs:string" 
many="false">true</property>
</binding.jca>
</service>

図5-13 「アダプタ構成ウィザード - ファイル・ディレクトリ」ページ

図5-13の説明が続きます
「図5-13 「アダプタ構成ウィザード - ファイル・ディレクトリ」ページ」の説明

5.2.20 追加モード

Oracleファイル/FTPアダプタを使用すると、既存のファイルに追加するアウトバウンド相互作用を構成できます。「既存のファイルに追加します」オプションを使用すると、アウトバウンド起動で同じファイルに書き込むことができます。ファイル名に追加するには、2つの方法があります。

  • 静的 — アウトバウンドのOracleファイル・アダプタのJCAファイルに追加します。

  • 動的 — ヘッダー・メカニズムを使用します。

ノート:

SFTPシナリオの場合、追加モードはサポートされておらず、既存のファイルに追加されるかわりにファイルが上書きされます。

「ファイル構成」ページで「既存のファイルに追加します」オプションを選択すると、「メッセージ数の到達」、「経過時間の超過」、「ファイル・サイズの超過」などのバッチ処理オプションが無効になります。図5-14に、「既存のファイルに追加します」オプションを示します。

図5-14 「アダプタ構成ウィザード - ファイル構成」ページ

図5-14の説明が続きます
「図5-14 「アダプタ構成ウィザード - ファイル構成」ページ」の説明

ウィザードで「追加」を選択すると、バッチ処理オプションが無効化されます。また、静的ファイル・ネーミング規則ではなく動的ファイル・ネーミング規則を指定すると、次のエラー・メッセージが表示されます。

You cannot choose to Append Files and use a dynamic file naming convention at the same time

Oracle FTPアダプタで追加機能を使用する場合は、FTPサーバーがAPPEコマンドをサポートしていることを確認してください。

5.2.21 Oracle FTPアダプタのディレクトリ内のファイルの再帰的処理

Oracle SOA Suiteの以前のバージョンでは、インバウンドのOracle FTPアダプタNLST (名前リスト) FTPコマンドを使用してFTPサーバーから取得したファイル名のリストを読み取っていました。ただし、NLSTコマンドはディレクトリ名を返さないため、ディレクトリ内での再帰的処理はできませんでした。現在、Oracle FTPアダプタではかわりにLISTコマンドを使用しています。

ただし、LISTコマンドによるレスポンスはFTPサーバーによって異なります。LISTコマンドに起因する微妙な差異を標準の方法に取り入れるために、次のパラメータがOracle FTPアダプタのデプロイメント・ディスクリプタに追加されています。

  • defaultDateFormat: このパラメータでは、デフォルトの日付書式の値を指定します。FTPサーバー上では、これは古いファイルの値です。このパラメータのデフォルト値はMMM d yyyyです。これは、UNIX型のほとんどのFTPサーバーが古いファイルの最終変更時のタイムスタンプをMMM d yyyyの書式で返すためです。たとえば、Jan 31 2006です。

    FTPコマンドライン・クライアントでls -lコマンドを使用すると、FTPサーバーのデフォルトの日付書式を確認できます。たとえば、Linuxで稼働しているvsftpdサーバーの場合、ls -lは次の結果を返します。

    -rw-r--r--    1 500      500           377 Jan 22 2005 test.txt
    

    Microsoft Windows NT FTPサーバーの場合、defaultDateFormatMM-dd-yy hh:mmaです。たとえば、03-24-09 08:06AM <DIR> oracleのようになります。

  • recentDateFormat: このパラメータでは、最新の日付書式の値を指定します。FTPサーバー上では、これは最近作成されたファイルの値です。

    このパラメータのデフォルト値はMMM d HH:mmです。これは、UNIX型のほとんどのFTPサーバーが最近作成されたファイルの最終変更日付をMMM d HH:mmの書式で返すためです。たとえば、Jan 31 21:32のようになります。

    FTPコマンドライン・クライアントでls -lコマンドを使用すると、FTPサーバーのデフォルトの日付書式を確認できます。たとえば、Linuxで稼働しているvsftpdサーバーの場合、ls -lは次の結果を返します。

    150 Here comes the directory listing.
    -rw-r--r--    1 500      500           377 Jan 30 21:32 address.txt
    -rw-r--r--    1 500      500           580 Jan 3121:32 container.txt
    .....................................................................................
    

    Microsoft Windows NT FTPサーバーの場合、recentDateFormatパラメータはMM-dd-yy hh:mmaというフォーマットになります。たとえば、03-24-09 08:06AM <DIR> oracleのようになります。

  • serverTimeZone: サーバーのタイムゾーン(America/Los_Angelesなど)です。このパラメータを空白に設定すると、Oracle FTPアダプタを実行しているサーバーのデフォルト・タイムゾーンが使用されます。

  • listParserKey: LISTコマンドによるレスポンスをどのように解析するかをOracle FTPアダプタに指示します。デフォルト値はUNIXです。この場合、Oracle FTPアダプタは、UNIX型FTPサーバーの一般的なパーサーを使用します。UNIX以外にサポートされている他の値は、WINVMSOS2OS400およびMVSです。名前が示すとおり、サポートされている各値は、特定のオペレーティング・システムに使用されます。たとえば、Microsoft Windowsで実行するFTPサーバーの場合はlistParserKeyWINに設定し、IBM iSeriesで実行するFTPサーバーの場合はlistParserKeyOS400に設定します。

    ノート:

    ロケール言語がFTPサーバーとオペレーティング・システムで異なる場合があります。FTPサーバーと稼働元のオペレーティング・システムのロケールが同じだと仮定しないでください。ロケールが異なる場合は、serverLocaleLanguageserverLocaleCountryおよびserverLocaleVariantパラメータを設定する必要があります。

  • serverLocaleLanguage: このパラメータでは、言語のロケール・コンストラクトを指定します。

  • serverLocaleCountry: このパラメータでは、国のロケール・コンストラクトを指定します。

  • serverLocaleVariant: このパラメータでは、バリアントのロケール・コンストラクトを指定します。

5.2.21.1 デプロイメント・ディスクリプタのパラメータの構成

通常、FTPサーバーの標準の日付書式は、FTPサーバーのインストール時に構成されます。FTPサーバーでdefaultDateFormatにMMM d yyyyの書式を、recentDateFormatにMMM d HH:mmの書式を使用する場合、Oracle FTPアダプタは、その対応するデプロイメント・ディスクリプタで同じ書式を使用する必要があります。

コマンドラインFTPでls -lを入力すると、次の内容を確認できます。

200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r--r--    1 500      500           377 Jan 22 21:32 1.txt
-rw-r--r--    1 500      500           580 Jan 22 21:32 2.txt
.................................................................................

これはFTPサーバーのrecentDateFormatパラメータであり、たとえば、MMM d HH:mm (Jan 22 21:32)のように表示されます。同様に、サーバーに古いファイルがある場合、そのサーバーでは時と分の部分が表示されず、次のように表示されます。

-rw-r--r--    1 500      500           377 Jan 22 2005 test.txt 

これはデフォルトの日付書式です。たとえば、MMM d yyyy (Jan 22 2005)のように表示されます。

さらに、特定のタイムゾーンで実行しているFTPサーバーのタイムスタンプを解析するために、Oracle FTPアダプタserverTimeZoneパラメータが使用されます。その値には、PSTのような略称かAmerica/Los_Angelesのような完全名のいずれかが指定されます。

さらに、FTPサーバーを異なるロケールで実行している場合もあります。言語、国、バリアントによるロケールを構成するために、serverLocaleLanguageserverLocaleCountryおよびserverLocaleVariantの各パラメータを使用します。ここで

  • 言語は小文字2文字のISO-639コードで指定します(たとえば、en)。

  • 国は大文字2文字のISO-3166コードで指定します(たとえば、US)。

  • バリアントはベンダーおよびブラウザ固有のコードで指定します。

これらのロケール・パラメータが指定されていない場合、Oracle FTPアダプタはシステム・ロケールを使用してタイムスタンプを解析します。

さらに、FTPサーバーをSOAスイートとは異なるシステムで実行している場合は、マシン間のタイムゾーンの差異を処理する必要があります。Oracle FTPアダプタを実行しているシステムとFTPサーバーの時差をミリ秒に換算し、その値をcomposite.xmlファイルのバインディング・プロパティtimestampOffsetとして追加する必要があります。

たとえば、FTPサーバーがローカル時間よりも6時間進んでいる場合は、次のエンドポイント・プロパティをサービスまたは参照に追加する必要があります。次の例を参照してください。

例 - FTPサーバーがローカル時間よりも進んでいる場合に追加するエンドポイント・プロパティ

<service name="FTPDebatchingIn">
    <interface.wsdl
interface="http://xmlns.oracle.com/pcbpel
             /adapter/ftp/FTPDebatchingIn/#wsdl.
interface(Get_ptt)"/>
    <binding.jca config="DebatchingIn_ftp.jca">
<property name=" timestampOffset" 
               type="xs:string" 
                        many="false" source="" 
override="may"> 21600000</property>
    </binding.jca>
  </service>

LISTコマンドを適切に処理できないFTPサーバーもあります。その場合は、リスト表示にNLSTコマンドを使用します。ただし、NLSTではディレクトリを再帰的に処理できません。

NLSTコマンドを使用するには、次のプロパティをJCAファイルに追加する必要があります。次の例を参照してください。

例 - NLSTプロパティの追加

<?xml version="1.0" encoding="UTF-8"?>
<adapter-config name="FTPDebatchingIn" 
                   adapter="Ftp Adapter"
 xmlns="http://platform.integration.oracle/
                  blocks/adapter/fw/metadata">
<connection-factory location="eis/Ftp/FtpAdapter"
                     UIincludeWildcard="*.txt"
 adapterRef=""/>
    <activation-spec 
className="oracle.tip.adapter.ftp.
                  inbound.FTPActivationSpec">
       …………………………………………..
       …………………………………………..
      <property name="UseNlst" value="true"/>
    </activation-spec>
  </endpoint-activation>
</adapter-config>

5.2.22 エンタープライズ情報システムの資格証明の保護

リソース・アダプタは、エンタープライズ情報システム(EIS)とのアウトバウンド接続を確立する際に、有効なセキュリティ資格証明を使用してサインオンする必要があります。J2CA 1.5仕様に従って、Oracle WebLogic Serverではアウトバウンド接続についてコンテナ管理のサインオンとアプリケーション管理のサインオンの両方がサポートされています。実行時に、Oracle WebLogic Serverは、起動するクライアント・コンポーネントのデプロイメント・ディスクリプタまたはリソース・アダプタのデプロイメント・ディスクリプタのres-auth要素で指定された情報に基づいて、選択されたサインオン・メカニズムを判別します。この項では、Oracle WebLogic Serverのコンテナ管理のサインオンを使用して、Oracle JCAアダプタのユーザー名とパスワードを保護する手順について説明します。

Oracle WebLogic ServerとEISの両方で、独立したセキュリティ・レルムが保守されます。コンテナ管理のサインオンを使用すると、Oracle WebLogic Serverにサインオンできるのみでなく、EISに別途サインオンしなくてもリソース・アダプタを介してEISにアクセスするアプリケーションを使用できます。Oracle WebLogic Serverでは、コンテナ管理のサインオンに資格証明マッピングが使用されます。Oracle WebLogicセキュリティ・プリンシパル(認証済の個別ユーザーまたはクライアント・アプリケーション)の資格証明(ユーザー名/パスワードのペアまたはセキュリティ・トークン)が、EISへのアクセスに必要な対応する資格証明にマップされます。デプロイ済の任意のリソース・アダプタに適用可能なセキュリティ・プリンシパルについて、資格証明マッピングを構成できます。

最初にコンテナ管理のサインオンを使用するには、使用する接続プールでコンテナ管理のサインオンがサポートされていることを確認する必要があります。既存の接続プールに対してコンテナ管理のサインオンを有効にする場合、またはコンテナ管理のサインオンをサポートする新規のプールを作成する場合は、次のステップを実行します。

  1. SOAアダプタ.rarファイルが含まれているOracle SOAインストール・ディレクトリ(たとえば、</fmwhome/AS11gR1SOA>/soa/connectorsまたは<C:\Oracle\Middleware\Oracle_SOA1>\soa\connectors。大カッコ内のパスは適切なパスで置き換えてください。)に移動します。
  2. weblogic-ra.xmlを変更するアダプタ.rarファイル(FtpAdapter.rarなど)のバックアップ・コピーを作成します。
  3. .rar ファイルからweblogic-ra.xmlを抽出し、抽出したweblogic-ra.xmlをエディタで開きます。
  4. weblogic-ra.xml内の既存の接続プールについて、その接続プールの<wls:connection-properties>の下に<wls:res-auth>Container</wls:res-auth>が存在しない場合は、このプロパティを接続プールに追加します。

    たとえば、FTPアダプタ内の事前構成済のeis/Ftp/FtpAdapter接続プールは、次の例のように定義されています。

    例 - 事前構成済の接続プールの定義

    <wls:connection-instance> 
    <wls:description>Ftp Adapter</wls:description>
    <wls:jndi-name>eis/Ftp/FtpAdapter</wls:jndi-name>
    <wls:connection-properties>
     <wls:res-auth>Container</wls:res-auth>
    </wls:connection-properties>
    

    この例は、このプールでコンテナ管理のサインオンがサポートされることを示しています。

  5. コンテナ管理のサインオンをサポートする新規の接続プールを作成するには、既存のインスタンスを例として使用して、新規の接続プール・インスタンスを追加します。JNDI名またはコネクション・ファクトリ名(あるいはその両方)を適切な名前に置き換える必要があります。コンテナ管理のサインオンをサポートするJMS接続プールのサンプル構成を次に示します。

    (コンテナ管理のサインオンを有効にするには、java.naming.factory.initialおよびjava.naming.provider.urlが存在している必要があります。)

    例 - コンテナ管理のサインオンをサポートするJMS接続プールのサンプル構成

     <connection-instance> 
      <jndi-name>eis/jms/MyConnectionPool</jndi-name> 
        <connection-properties> 
          <properties> 
            <property> 
             <name>ConnectionFactoryLocation</name> 
               <value>jms/MyConnectionFactory</value> 
            </property> 
            <property> 
              <name>FactoryProperties</name> 
               <value>java.naming.factory.initial
                   =weblogic.jndi.
                          WLInitialContextFactory;java. 
                     naming.provider.url=
                       t3://ncosmidi-us5.us.
                             mydomain.com:8001</value> 
             </property> 
             <property> 
               <name>AcknowledgeMode</name>
                <value>AUTO_ACKNOWLEDGE</value> 
             </property> 
             <property> 
               <name>IsTopic</name> 
               <value>true</value> 
             </property> 
             <property> 
              <name>IsTransacted</name> 
                <value>false</value>
             </property>
             <property> 
              <name>Username</name> 
              <value></value> 
             </property> 
             <property> 
               <name>Password</name> 
               <value></value> 
             </property> 
               </properties> 
             <res-auth>Container</res-auth>
        </connection-properties> 
     </connection-instance>
     
  6. 変更したweblogic-ra.xmladapter.rarに戻し、.rarファイル内で既存のweblogic-ra.xmlと置き換わっていることを確認します。
  7. WebLogic Serverコンソールの「デプロイメント」に進み、アダプタ(FTPアダプタやJMSアダプタなど)を選択します。「更新」をクリックします。
  8. 新規の接続プール(JMSプールなど)を作成する場合、「デプロイメント」→「JmsAdapter」→「構成」→「アウトバウンド接続プール」を順に開き、「oracle.tip.adapter.jms.IJmsConnectionFactory」を開いて新規の接続プールが存在していることを確認します。

    これらのステップ後、Oracle WebLogic Serverコンソールを使用して次の手順を実行して、対応するプールの資格証明マッピングを構成できます。そのように行うには:

  9. Oracle WebLogic Server管理コンソールにログインします。

    「ドメイン構造」ペインで「デプロイメント」をクリックします。図5-15に示すように、デプロイ済のアプリケーションとアダプタが表示されます。

    図5-15 Oracle WebLogic Server管理コンソール - 「デプロイメントの概要」ページ

    図5-15の説明が続きます
    「図5-15 Oracle WebLogic Server管理コンソール - 「デプロイメントの概要」ページ」の説明
  10. セキュリティ資格証明を作成する必要のあるアダプタをクリックします。たとえば、FtpAdapterをクリックします。図5-16に示すように、FtpAdapterの設定ページが表示されます。

    図5-16 Oracle WebLogic Server管理コンソール - 「FtpAdapterの設定」ページ

    図5-16の説明が続きます
    「図5-16 Oracle WebLogic Server管理コンソール - 「FtpAdapterの設定」ページ」の説明
  11. セキュリティ」タブをクリックします。図5-17に示すように、FtpAdapterの設定ページの「スタンドアロン・リソース・アダプタ・ロール」ペインが表示されます。

    図5-17 Oracle WebLogic Server管理コンソール - 「FtpAdapterの設定」ページ

    図5-17の説明が続きます
    「図5-17 Oracle WebLogic Server管理コンソール - 「FtpAdapterの設定」ページ」の説明
  12. 「資格証明マッピング」タブをクリックします。
  13. 「資格証明マッピング」ペインで「新規」をクリックします。図5-18に示すように、「新しいセキュリティ資格証明マッピングの作成」ページが表示されます。

    図5-18 Oracle WebLogic Server管理コンソール - 「新しいセキュリティ資格証明マッピングの作成」ページ

    図5-18の説明が続きます
    「図5-18 Oracle WebLogic Server管理コンソール - 「新しいセキュリティ資格証明マッピングの作成」ページ」の説明
  14. 図5-19に示すように、「eis/Ftp/FtpAdapter」(Oracle FTPアダプタのJNDI)を選択し、Oracle FTPアダプタのセキュリティ資格証明マップ・エントリを作成します。

    図5-19 Oracle WebLogic Server管理コンソール - 「新しいセキュリティ資格証明マッピングの作成」ページ

    図5-19の説明が続きます
    「図5-19 Oracle WebLogic Server管理コンソール - 「新しいセキュリティ資格証明マッピングの作成」ページ」の説明
  15. 「次へ」をクリックします。図5-20に示すように、「新しいセキュリティ資格証明マッピングの作成 – WebLogic Serverユーザー」ページが表示されます。

    図5-20 Oracle WebLogic Server管理コンソール - 「新しいセキュリティ資格証明マッピングの作成」ページ

    図5-20の説明が続きます
    「図5-20 Oracle WebLogic Server管理コンソール - 「新しいセキュリティ資格証明マッピングの作成」ページ」の説明

    ノート:

    「初期接続作成用ユーザー」および「未認証WLSユーザー」オプションの場合、資格証明マッピングはサポートされていません。

  16. 図5-21に示すように、「構成済みユーザー名」を選択し、「WebLogic Serverユーザー名」フィールドにOracle WebLogic Serverユーザー名を入力します。たとえば、weblogicと入力します。これはデフォルト・ユーザー名です。構成によっては「構成済みユーザー名」を使用できないことがあるため、その場合は「デフォルト・ユーザー」を選択します。

    図5-21 Oracle WebLogic Server管理コンソール - 「新しいセキュリティ資格証明マッピングの作成」ページ

    図5-21の説明が続きます
    「図5-21 Oracle WebLogic Server管理コンソール - 「新しいセキュリティ資格証明マッピングの作成」ページ」の説明
  17. 「次へ」をクリックします。「新しいセキュリティ資格証明マッピングの作成 – EISユーザー名およびパスワード」ページが表示されます。
  18. 図5-22に示すように、「EISユーザー名」フィールドにEISユーザー名を入力し、「EISパスワード」フィールドにEISパスワードを入力し、「パスワードの確認」フィールドにEISパスワードを再入力してパスワードを確認します。

    図5-22 Oracle WebLogic Server管理コンソール - 「新しいセキュリティ資格証明マッピングの作成」ページ

    図5-22の説明が続きます
    「図5-22 Oracle WebLogic Server管理コンソール - 「新しいセキュリティ資格証明マッピングの作成」ページ」の説明
  19. 「終了」をクリックします。図5-23に示すように、新しいセキュリティ資格証明マッピングが作成されます。

    図5-23 Oracle WebLogic Server管理コンソール - 「FtpAdapterの設定」ページ

    図5-23の説明が続きます
    「図5-23 Oracle WebLogic Server管理コンソール - 「FtpAdapterの設定」ページ」の説明

5.3 Oracleファイル/FTPアダプタの説明

Oracleファイル/FTPアダプタの考え方を概観します。

5.3.1 Oracleファイル・アダプタのRead Fileの説明

インバウンド方向では、Oracleファイル・アダプタにより、ファイル・システムからのファイルのポーリングおよび読取りが行われて処理されます。この項では、Oracleファイル・アダプタのインバウンド・ファイル読取り機能の概要を説明します。BPELプロセスまたはメディエータOracleファイル・アダプタを使用するように構成するには、アダプタ構成ウィザードを使用します。Oracleファイル・アダプタを構成すると、インバウンドのWSDLおよびJCAファイルのペアが作成されます。

次の各項では、Oracleファイル・アダプタのRead Fileの概念について説明します。

5.3.1.1 インバウンド操作

Oracleファイル・アダプタを使用したインバウンド操作では、図5-24に示すように「Read File」操作を選択します。

図5-24 「Read File」操作の選択

図5-24の説明が続きます
「図5-24 「Read File」操作の選択」の説明
5.3.1.2 インバウンド・ファイル・ディレクトリの指定

図5-25に示すアダプタ構成ウィザードの「ファイル・ディレクトリ」ページでは、インバウンド・ファイルの読取りに使用するディレクトリや、正常に処理されたファイルを配置するディレクトリの情報を指定できます。ディレクトリ内のファイルを再帰的に処理することも選択できます。さらに、複数のディレクトリも指定できます。

図5-25 アダプタ構成ウィザード - 着信ファイルの指定

図5-25の説明が続きます
「図5-25 アダプタ構成ウィザード - 着信ファイルの指定」の説明

次の項では、指定するファイル・ディレクトリ情報について説明します。

5.3.1.2.1 SOAコンポジットでのインバウンドの物理または論理ディレクトリ・パスの指定

Oracle BPEL PMメディエータが関係するコンポジットでは、インバウンドのディレクトリ名を物理パスまたは論理パスとして指定できます。物理パスはc:\inputDirのような値です。

ノート:

インバウンドのOracleファイル・アダプタが着信ファイルを複数のディレクトリでポーリングするように構成されている場合は、ファイル・リーダーがこれらのディレクトリのポーリングを開始する前に、すべての最上位ディレクトリ(入力ファイルが表示されるインバウンド・ディレクトリ)が存在している必要があります。

コンポジットでは、論理プロパティはインバウンドJCAファイルで指定され、その論理/物理マッピングはバインディング・プロパティを使用して解決されます。設計時に一度論理パラメータを指定し、必要に応じて後から物理ディレクトリ名を変更できます。

たとえば、論理入力ディレクトリ名がInputFileDirの場合、生成されるインバウンドJCAファイルは次のようになります。

例 - 生成されたインバウンド.jcaファイル

<?xml version="1.0" encoding="UTF-8"?>
<adapter-config name="FlatStructureIn" 
                 adapter="File Adapter" 
xmlns="http://platform.integration.oracle/
             blocks/adapter/fw/metadata">
  
  <connection-factory location="eis/FileAdapter"
           UIincludeWildcard="*.txt" 
adapterRef=""/>
  <endpoint-activation operation="Read">
    <activation-spec 
className="oracle.tip.adapter.file.
                     inbound.FileActivationSpec">
      <property name="UseHeaders" value="false"/>
      <property name="LogicalDirectory" 
                   value="InputFileDir"/>
      <property name="Recursive" value="true"/>
      <property name="DeleteFile" value="true"/>
      <property name="IncludeFiles" value=".*\.txt"/>
      <property name="PollingFrequency" value="10"/>
      <property name="MinimumAge" value="0"/>
      <property name="OpaqueSchema" value="false"/>
    </activation-spec>
  </endpoint-activation>

</adapter-config>

composite.xmlファイルで、対応する論理ActivationSpecまたはInteractionSpecの物理パラメータ値(この場合はディレクトリ・パス)を指定します。これにより、論理ディレクトリ名と実際の物理ディレクトリ名のマッピングが解決されます。次の例を参照してください。

例 - 対応するActivationSpecまたはInteractionSpecのディレクトリ・パスの指定

<service name="FlatStructureIn">
    <interface.wsdl 
     interface="http://xmlns.oracle.com/pcbpel/
               adapter/file/FlatStructureIn/#wsdl.
     interface(Read_ptt)"/>
    <binding.jca config="FlatStructureIn_file.jca">
<property name=" InputFileDir" type="xs:string"
                        many="false" source="" 
      override="may"> /home/user/inputDir</property>
 
 </binding.jca>
</service>
5.3.1.2.2 正常に処理されたファイルのアーカイブ

このオプションでは、正常に処理されたファイルを配置するディレクトリを指定できます。また、アーカイブ・ディレクトリを論理名として指定できます。この場合は、「SOAコンポジットでのインバウンドの物理または論理ディレクトリ・パスの指定」で説明されている論理ディレクトリから物理ディレクトリへのマッピングを行う必要があります。

5.3.1.2.3 取得後のファイルの削除

このオプションでは、ファイルを正常な取得後に削除するかどうかを指定できます。このチェック・ボックスが選択されていない場合、処理済のファイルはインバウンド・ディレクトリに残りますが無視されます。最後に処理されたファイルより更新日が新しいファイルのみが取得されます。処理済のファイルと同じ名前で更新日が古いままのファイルをインバウンド・ディレクトリに配置した場合、そのファイルは取得されません。

5.3.1.3 ファイルの検索とバッチ処理

図5-26に示すアダプタ構成ウィザードの「ファイルのフィルタ処理」ページでは、取得または無視するファイルの詳細を指定できます。

Oracleファイル・アダプタは、インバウンド方向のファイル・リスナーとして機能します。Oracleファイル・アダプタにより、ローカルまたはリモートのファイル・システム上の指定したディレクトリがポーリングされ、指定したネーミング基準に一致するファイルが検索されます。

図5-26 「アダプタ構成ウィザード - ファイルのフィルタ処理」ページ

図5-26の説明が続きます
「図5-26 「アダプタ構成ウィザード - ファイルのフィルタ処理」ページ」の説明

次の項では、指定するファイル・フィルタ処理情報について説明します。

5.3.1.3.1 ネーミング・パターンの指定

Oracleファイル・アダプタがインバウンド・ファイルのポーリングに使用するネーミング規則を指定します。また、処理対象外にするファイルのネーミング規則も指定できます。2つのネーミング規則を選択できます。Oracleファイル・アダプタにより、インバウンド・ディレクトリに配置されるファイルが検索されます。

  • ファイル・ワイルドカード(po*.txt)

    poで始まり.txtで終わるすべてのファイルが取得されます。この規則はWindowsオペレーティング・システムの標準に準拠しています。

  • 正規表現(po.*\.txt)

    poで始まり.txtで終わるすべてのファイルが取得されます。この規則は、Java Development Kit (JDK)の正規表現(regex)構文に準拠しています。

ノート:

  • 後から別のネーミング・パターンを選択する場合は、「インクルード・ファイルの名前パターン」および「処理対象外ファイルの名前パターン」フィールドで指定するネーミング規則も変更してください。アダプタ構成ウィザードにより自動的に変更されることはありません。

  • ファイルを取得する際、検索対象として*.*指定しないでください。

  • オペレーティング・システムにより設定されているファイルの長さの制限に注意してください。たとえば、Windowsオペレーティング・システムでは、ファイル名(ファイル名と完全なディレクトリ・パスを合せた長さ)を256文字より長くできません。制限によりファイル名に特定の文字を使用できないオペレーティング・システムもあります。たとえば、Windowsオペレーティング・システムでは、バックスラッシュ(\)、スラッシュ(/)、コロン(:)、アスタリスク(*)、左角カッコ(<)、右角カッコ(>)または縦線(|)などの文字は許可されていません。

5.3.1.3.2 処理対象ファイルと処理対象外ファイル

正規表現を使用する場合、「インクルード・ファイルの名前パターン」および「処理対象外ファイルの名前パターン」フィールドで指定する値は、JDKの正規表現(regex)構文に準拠している必要があります。どちらのフィールドにも、異なるregexパターンを別々に指定する必要があります。「インクルード・ファイルの名前パターン」フィールドおよび「処理対象外ファイルの名前パターン」フィールドは、インバウンドWSDLファイルのIncludeFilesおよびExcludeFilesパラメータに対応します。

ノート:

regexパターンはJDK regexパターンに準拠しています。JDK regexパターンに準じると、任意の文字列が任意の回数発生するパターンの正しいコノテーションはピリオドとプラス記号です(.+)。JDK regexでは、アスタリスク(*)は任意の文字が任意の回数発生する文字列のプレースホルダではありません。

インバウンドOracleファイル・アダプタで、poで始まり、拡張子がtxtであるすべてのファイル名を取得するには、名前パターンが正規表現である場合は、「インクルード・ファイルの名前パターン」フィールドでpo.*\.txtとして指定する必要があります。次にこのregexパターンの例で使用された記号の意味を示します。

  • ピリオド(.)は任意の文字を表します。

  • アスタリスク(*)は任意の発生数を表します。

  • ピリオドが続くバックスラッシュ(\.)は、エスケープ文字のバックスラッシュで示されているように、文字としてのピリオド(.)を表します。

「処理対象外ファイルの名前パターン」フィールドも同様に構成します。

「インクルード・ファイルの名前パターン」フィールドと「処理対象外ファイルの名前パターン」フィールドの式に重複がある場合、処理対象外ファイルの式が優先されます。たとえば、「インクルード・ファイルの名前パターン」がabc*.txtに設定され、「処理対象外ファイルの名前パターン」がabcd*.txtに設定されている場合、abcd*.txtファイルは受信されません。

ノート:

「インクルード・ファイルの名前パターン」フィールドには名前パターンを入力する必要があり、空白のままにすることはできません。入力しなかった場合、インバウンド・アダプタ・サービスはインバウンド・ディレクトリ内に存在するすべてのファイルを読み取り、不正な結果を招きます。

表5-4にJava regex構文の詳細を示します。

ノート:

JDK regexのパターン名を、プラス記号(+)、疑問符(?)またはアスタリスク(*)で始めることはできません。

表5-4 Javaの正規表現構文

一致 構文

文字

-

文字x

x

バックスラッシュ文字

\\

8進数値0n (0 <= n <= 7)を含む文字

\0n

8進数値0nn (0 <= n <= 7)を含む文字

\0nn

8進数値0mnn (0 <= m <= 3、0 <= n <= 7)を含む文字

\0mnn

16進数値0xhhを含む文字

\xhh

16進数値0xhhhhを含む文字

\uhhhh

タブ文字('\u0009')

\t

改行文字('\u000A')

\n

キャリッジ・リターン文字('\u000D')

\r

用紙送り文字('\u000C')

\f

警告(ベル)文字('\u0007')

\a

エスケープ文字('\u001B')

\e

xに対応する制御文字

\cx

-

-

文字クラス

-

ab、またはc (単純クラス)

[abc]

abc以外の文字(否定)

[^abc]

a - zまたはA - Z (範囲)

[a-zA-Z]

a - dまたはm - p: [a-dm-p] (結合)

[a-d[m-p]]

de、またはf (交差)

[a-z&&[def]]

a - z (bcを除く): [ad-z] (減算)

[a-z&&[^bc]]

a - z (m - pを除く): [a-lq-z] (減算)

[a-z&&[^m-p]]

-

-

事前定義済文字クラス

-

任意の文字(行の終了文字と一致する場合もある)

-

数字: [0-9]

\d

数字以外: [^0-9]

\D

空白文字: [ \t\n\x0B\f\r]

\s

空白文字以外: [^\s]

\S

単語文字: [a-zA-Z_0-9]

\w

単語以外の文字: [^\w]

\W

最長一致数量子

-

X、1回または0回

X?

X、0回以上

X*

X、1回以上

X+

Xn

X{n}

Xn回以上

X{n,}

Xn回以上m回以下

X{n,m}

Java regex構文の詳細は、次のサイトを参照してください。

http://java.sun.com/j2se/1.5.0/docs/api

5.3.1.3.3 処理対象ファイルと処理対象外ファイル

FileList操作ではjava.file.IncludeFilesプロパティは公開されません。このプロパティは、次の例に示すように、アダプタ相互作用の設計中に構成され、ヘッダーを通じてオーバーライドすることはできません。

例 - FileList操作のオーバーライド

<adapter-config name="ListFiles" adapter="File Adapter"    xmlns="http://platform.integration.oracle
                   /blocks/adapter/fw/metadata">
   <connection-factory location="eis/FileAdapter"
                    UIincludeWildcard="*.txt" 
                        adapterRef=""/>
    <endpoint-interaction portType="FileListing_ptt" 
                               operation="FileListing">
    <interaction-spec className=
                    "oracle.tip.adapter.file.outbound.
                     FileListInteractionSpec">
        <property name="PhysicalDirectory" 
                             value="%INP_DIR%"/>
        <property name="PhysicalDirectory" 
                           value="%INP_DIR%"/>
        <property name="Recursive" value="true"/>
             <property name="Recursive" 
                            value="true"/>
             <property name="IncludeFiles"
                        value=".*\.txt"/>
   </interaction-spec>
   </endpoint-interaction>
</adapter-config>

この例では、いったん設定されたIncludeFilesは変更できません。

5.3.1.3.4 メッセージのデバッチ処理

複数のメッセージが含まれるファイルを着信するかどうかを選択し、パブリッシュする1つのバッチ・ファイルに含まれるメッセージ数を指定できます。ファイルに反復要素を含むメッセージが含まれる場合、特定のバッチ数でメッセージをパブリッシュするように選択できます。図5-26を参照してください。

ファイルに複数のメッセージがありチェック・ボックスが選択されている場合は、デバッチ処理が行われます。デバッチ処理が行われないのは、ファイルのメッセージが1つのみでチェック・ボックスが選択されていない場合です。ネイティブ・ファイルとXMLファイルではデバッチ処理がサポートされています。

5.3.1.4 ファイル・ポーリング

図5-27に示すアダプタ構成ウィザードの「ファイル・ポーリング」ページでは、次に示すインバウンド・ポーリング・パラメータを指定できます。

  • 新しいファイルを取得するためにインバウンド・ディレクトリをポーリングする頻度。

  • 取得するファイルの最短経過時間。たとえば、このポーリング・パラメータにより、大きなファイルが処理用に取得される前に、ディレクトリに完全にコピーできるようになります。経過時間は最終更新時のタイムスタンプで決定されます。たとえば、ファイルの書込みに3分から4分かかることがわかっている場合は、最短経過時間を5分に設定します。入力ディレクトリでファイルが検出されても、更新時間から5分経過していない場合、まだ書込みが行われている可能性があるためファイルは取得されません。

図5-27 「アダプタ構成ウィザード - ファイル・ポーリング」ページ

図5-27の説明が続きます
「図5-27 「アダプタ構成ウィザード - ファイル・ポーリング」ページ」の説明

ノート:

JCAファイル内のpollingパラメータの値を手動で変更しないでください。このパラメータを変更するには、アダプタ構成ウィザードを使用する必要があります。

5.3.1.4.1 トリガー・ファイルの使用

デフォルトでは、エンドポイントがアクティブ化されると、インバウンドのOracleファイル/FTPアダプタによるポーリングが開始されます。ただし、より厳密にポーリングを制御する場合は、ファイルベースのトリガーを使用できます。Oracleファイル/FTPアダプタでは、指定のトリガー・ファイルがローカル・ディレクトリまたはリモート・ディレクトリで検出されると、そのファイルのポーリングがインバウンド・ディレクトリ内で開始されます。

たとえば、あるBPELプロセスがファイルをディレクトリに書き込んでおり、第2のBPELプロセスが同じディレクトリでファイルをポーリングしているとします。第1のプロセスによる全ファイルの書込みが完了した後でのみ、第2のプロセスによるディレクトリのポーリングを開始するために、トリガー・ファイルを使用できます。第1のプロセスを、最後にトリガー・ファイルを作成するように構成できます。第2のプロセスは、トリガー・ファイルを検出した後でインバウンド・ディレクトリのポーリングを開始します。

ノート:

トリガー・ファイルのライフサイクルは、アダプタでは管理されません。トリガー・ファイルは外部で管理する必要があります。たとえば、エンドポイントをアントリガーし、外部アプリケーションを使用してトリガー・ファイルを削除して、TriggerFileStrategyをEndpointActivationまたはEveryTimeに指定します。

トリガー・ファイル・ディレクトリは、インバウンドのポーリング・ディレクトリと同一でなくてもかまいません。ただし、トリガー・ファイル・ディレクトリおよびインバウンドのポーリング・ディレクトリが同じ場合は、図5-26に示すように、トリガー・ファイルの名前がアダプタ構成ページで指定したファイル・フィルタに類似していないことを確認する必要があります。

トリガー・ファイルの内容が読み取られることはないため、インバウンドのreceiveアクティビティのペイロードとして使用しないでください。

表5-5に、インバウンド・サービスのJCAファイルに指定する必要があるパラメータを示します。

表5-5 トリガー・ファイルのパラメータ

パラメータ 説明

TriggerFilePhysicalDirectory

または

TriggerFileLogicalDirectory

Oracleファイル/FTPアダプタがトリガー・ファイルを検索するディレクトリの物理名または論理名。

TriggerFilePhysicalDirectoryおよびTriggerFileLogicalDirectoryパラメータはオプションです。この2つのパラメータを使用する必要があるのは、トリガー・ファイル・ディレクトリがインバウンドのポーリング・ディレクトリとは異なる場合のみです。デフォルトでは、Oracleファイル/FTPアダプタはトリガー・ファイルをインバウンドのポーリング・ディレクトリ内で検索します。

TriggerFilePhysicalDirectory="C:\foo"

TriggerFileLogicalDirectory= "TriggerFileDir"

TriggerFile

トリガー・ファイル名。

TriggerFile="Purchaseorder.trg"

TriggerFileStrategy

トリガー・メカニズムとして使用される戦略。次の値をとります。

EndpointActivation: アダプタは、コンポジットがアクティブ化されるたびにトリガー・ファイルを検索します。ノート: コンテナの起動、アプリケーションの再デプロイ、Fusion Middleware Controlによるコンポジット・アプリケーションのリタイアまたはアクティブ化を行うたびに、コンポジットがアクティブ化されます。

コンテナを再起動するたびに、指定されたディレクトリでトリガー・ファイルが検出されるまでコンポジット・アプリケーションはトリガーされません。

OnceOnly: アダプタは、その存続期間で1回のみトリガー・ファイルを検索します。検出されたトリガー・ファイルは、再起動後および再デプロイ後も記憶されます。

EveryTime: アダプタは、各ポーリング・サイクルでトリガー・ファイルを検索します。TriggerFileStrategyのデフォルト値はEndpointActivationです。

TriggerFileStrategy="EndpointActivation "

インバウンド・サービスにおけるJCAファイルのサンプルを次に示します。

例 - インバウンド・サービスのサンプルの.jcaファイル

<?xml version="1.0" encoding="UTF-8"?>
<adapter-config name="FlatStructureIn" adapter="File Adapter" 
  xmlns="http://platform.integration.oracle/
                  blocks/adapter/fw/metadata">
 
  <connection-factory 
                 location="eis/FileAdapter"
    UIincludeWildcard="*.txt" 
adapterRef=""/>
  <endpoint-activation operation="Read">
    <activation-spec className=
                 "oracle.tip.adapter.file.
       inbound.FileActivationSpec">
       <property.../>
       <property name=
                "TriggerFilePhysicalDirectory" 
             value="/tmp/flat/ArchiveDir"/>
    </activation-spec>
</endpoint-activation>
 
</adapter-config>
5.3.1.5 後処理

Oracleファイル・アダプタではいくつかの後処理オプションをサポートしています。ファイルの処理後、図5-27の「ファイル・ポーリング」ページで指定した場合はファイルが削除されます。また、図5-25の「ファイル・ディレクトリ」ページで指定した場合は、完了(アーカイブ)ディレクトリにファイルを移動することもできます。

5.3.1.6 ネイティブ・データ変換

次に表示されるアダプタ構成ウィザードのページは、図5-28の「メッセージ」ページです。このページでは、変換用のXSDスキーマ・ファイルを選択できます。

図5-28 スキーマの指定 - 「メッセージ」ページ

図5-28の説明が続きます
「図5-28 スキーマの指定 - 「メッセージ」ページ」の説明

ネイティブ・フォーマット変換が不要である場合は(JPGまたはGIFイメージが処理中であるなど)、「ネイティブ・フォーマット変換は不要」チェック・ボックスを選択します。ファイルはBase64エンコーディングで渡されます。

トランスレーションにはXSDファイルが必要です。新しいスキーマの定義、または既存のデータ型定義(DTD)やCOBOLコピーブックの変換を行うには、「ネイティブ・フォーマットのスキーマの定義」を選択します。これにより、ネイティブ・フォーマット・ビルダー・ウィザードが起動されます。このウィザードは、カンマ区切り値(CSV)、固定長、DTDおよびCOBOLコピーブックなどのファイル形式を使用したネイティブ・スキーマ・ファイルの作成を支援します。ネイティブ・スキーマ・ファイルの作成後、「スキーマ・ファイルのURL」および「スキーマ要素」フィールドが入力された「メッセージ」ページが表示されます。詳細は、「サポートされているファイル形式」を参照してください。

ノート:

指定するスキーマにネームスペースが含まれていることを確認してください。スキーマにネームスペースがないと、エラー・メッセージが表示されます。

5.3.1.7 インバウンド・サービス

Oracleファイル・アダプタの構成が終了すると、インバウンド・サービスのJCAファイルが生成されます。ファイル名は、アダプタ構成ウィザードの「サービス名」ページで指定したサービス名と同じです。後からウィザードを再起動して、操作定義を変更できます。

ActivationSpecパラメータには、インバウンド構成情報が含まれています。ActivationSpecと一連のインバウンドOracleファイル・アダプタ・プロパティは、インバウンドJCAファイルの一部です。

表5-6に、インバウンドJCAファイルのサンプルのプロパティを示します。

表5-6 インバウンド・サービスのサンプルのJCAプロパティ

プロパティ 値の例

UseHeaders

true

PhysicalDirectory

/tmp/opaque/in

Recursive

true

DeleteFile

false

IncludeFiles

.*\.xml

PollingFrequency

1

MinimumAge

0

ActivationSpecプロパティの値は、設計時にアダプタ構成ウィザードで指定されます(表5-6を参照)。インバウンドOracleファイル・アダプタでは、次の構成プロパティが使用されます。

  • PollingFrequency

  • MinimumAge

  • PhysicalDirectory

  • LogicalDirectory

  • PublishSize

  • PhysicalArchiveDirectory

  • LogicalArchiveDirectory

  • IncludeFiles

  • ExcludeFiles

  • UseHeaders

  • ListSorter

  • ThreadCount

  • Recursive

  • MaxRaiseSize

これらの構成プロパティの説明は、このマニュアルの付録Aを参照してください。

5.3.1.8 インバウンド・ヘッダー

図5-29に示すように、ペイロードを除いて、Oracleファイル・アダプタは次のヘッダー・メタデータをインバウンド・サービスからパブリッシュします。

  • jca.file.FileName: ファイル名

  • jca.file.Directory: ディレクトリ名

  • jca.file.Batch: デバッチ処理におけるバッチの一意の名前

  • jca.file.BatchIndex: デバッチ処理におけるバッチ内の各メッセージのバッチ索引

  • jca.file.Size: ファイル・サイズ

  • jca.file.LastModifiedTime: ファイルの最終変更時間

図5-29 「Invoke」ダイアログ

図5-29の説明が続きます
「図5-29 「起動」ダイアログ」の説明

5.3.2 Oracleファイル・アダプタのWrite Fileの説明

アウトバウンド方向では、Oracleファイル・アダプタはサービス・エンジンからのメッセージを受信し、ファイル・システムのファイルに書き込みます。この項では、Oracleファイル・アダプタのアウトバウンド・ファイル書込み機能の概要を説明します。BPELプロセスまたはメディエータ・サービスでOracleファイル・アダプタを使用するように構成するには、アダプタ構成ウィザードを使用します。これにより、アウトバウンドのWSDLJCAのファイルのペアが作成されます。

この項には次のトピックが含まれます:

5.3.2.1 アウトバウンド操作

Oracleファイル・アダプタを使用したアウトバウンド操作では、図5-30に示すように「Write File」操作を選択します。

図5-30 「Write File」操作の選択

図5-30の説明が続きます
「図5-30 「Write File」操作の選択」の説明

「出力ヘッダーの追加」チェック・ボックスは、「Write File」を選択した場合に表示されます。このチェック・ボックスを選択すると、アダプタWSDLに、ヘッダー・スキーマをポイントする出力メッセージが含められます(太字で示されます)。

例 - スキーマをポイントする出力メッセージを含むアダプタWSDL

 <wsdl:definitions name="fileout3"
  targetNamespace="http://xmlns.oracle.com/pcbpel
           /adapter/file/SOAApp1/NewJCAFmwk/     
                   fileout3"
    xmlns:jca="http://xmlns.
                   oracle.com/pcbpel/wsdl/jca/"
xmlns:FILEAPP="http://xmlns.oracle.com
                    /pcbpel/adapter/file/"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:tns="http://xmlns.oracle.com/pcbpel
             /adapter/file/SOAApp1/NewJCAFmwk/
                 fileout3"
xmlns:plt="http://schemas.xmlsoap.org/ws
              /2003/05/partner-link/">"
xmlns:opaque=
    "http://xmlns.oracle.com/
    pcbpel/adapter/opaque/"
<plt:role name="Write_role" >
  <plt:portType name="tns:Write_ptt" />
  </plt:role>
</plt:partnerLinkType>"
<wsdl:types>
<schema TargetNamespace=
         "http://xlmns.oracle.com/pcbpel/
              adapter/opaque/"
   xmlns:opaque="http://xmlns.oracle.com
                       /pcbpel/adapter/opaque/"
      xmlns="http://www.w3.org/2001/XMLSchema" >
   <element name="opaqueElement"
                    type="base64Binary" />
</schema>
<schema targetNamespace=
        "http://xmlns.oracle.com/pcbpel/
          adapter/file/"
xmlns="http://www.w3.org/2001/XMLSchema"
  attributeFormDefault="qualified"
  <element name="OutboundFileHeaderType" >
   <complexType>
    <sequence>
     <element name="filename" type="string" />
     <element name="directory" type="string" />
   </sequence>
   </complexType>
   </element>
</schema>
</wsdl:types>
   <wsdl:message name="Write_msg">
   <wsdl:part name="opaque" element=
         "opaque:opaqueElement"/>
</wsdl:message>
   <wsdl:message name="Output_msg">
   <wsdl:part name="body" 
             element=
       "FILEAPP:OutboundFileHeaderType"/>
</wsdl:message>
   <wsdl:portType name="Write_ptt">
   <wsdl:operation name="Write">
     <wsdl:input message="tns:Write_msg"/>
     <wsdl:output message="tns:Output_msg"/>
       </wsdl:operation>
     </wsdl:portType>
</wsdl:definitions>

編集モードで出力ヘッダーの更新チェック・ボックスを選択すると、出力メッセージ/ヘッダー・スキーマがアダプタWSDLから削除されます。

5.3.2.2 アウトバウンド・ファイル・ディレクトリの作成

アウトバウンド操作では、アウトバウンド・ディレクトリ、使用するアウトバウンド・ファイル・ネーミング規則、および必要な場合は使用するバッチ・ファイル規則も指定できます。

図5-31に示すアダプタ構成ウィザードの「ファイル構成」ページでは、発信ファイルのディレクトリやアウトバウンド・ファイル・ネーミング規則を指定できます。

図5-31 アダプタ構成ウィザード - 発信ファイルのパラメータ

図5-31の説明が続きます
「図5-31 アダプタ構成ウィザード - 発信ファイルのパラメータ」の説明

次の項では、指定するファイル構成情報について説明します。

5.3.2.2.1 Oracle BPEL PMでのアウトバウンドの物理または論理ディレクトリ・パスの指定

アウトバウンド・ディレクトリ名を物理または論理パスとして指定できます。物理パスはc:\outputDirのような値です。

論理アウトバウンド・ディレクトリ名がOutputFileDirの場合、論理パラメータを指定すると、生成されるJCAファイルは次のようになります。次の例を参照してください。

例 - サンプルの論理アウトバウンド・ディレクトリに対して生成されるJCAファイル

<?xml version="1.0" encoding="UTF-8"?>
<adapter-config name="FlatStructureOut" 
          adapter="File Adapter" 
  xmlns="http://platform.integration.
                oracle/blocks/
    adapter/fw/metadata">
  <connection-factory location="eis/FileAdapter" 
                       adapterRef=""/>
  <endpoint-interaction operation="Write">
    <interaction-spec 
className="oracle.tip.adapter.file.outbound.
                       FileInteractionSpec">
      <property name="LogicalDirectory" 
                     value="OutputFileDir"/>
      <property name="FileNamingConvention" 
              value="%yyMMddHHmmssSS%_%SEQ%_
                       %yyyyMMdd%_%SEQ%.out.%SEQ%"/>
      <property name="Append" value="false"/>
      <property name="NumberMessages" value="1"/>
      <property name="OpaqueSchema" value="false"/>
    </interaction-spec>
  </endpoint-interaction>

</adapter-config>

JDeveloperウィザードの「外部参照」スイムレーンでアウトバウンド・アダプタを選択します(composite.xmlのタブに表示されます)。アウトバウンド・アダプタの「プロパティ・インスペクタ」でバインディング・プロパティを作成します(下方向にスクロールして表示する必要があります)。「プロパティの作成」ボックスが表示されてから、「名前」フィールドにOutputFileDirと入力し、「値」フィールドに実際の出力ディレクトリ名(例: C:\outputDir)を入力します。composite.xmlファイルが表示されます。次の例を参照してください。

例 - アウトバウンド・ディレクトリが指定されたプロパティの作成

<reference name="FlatStructureOut">
    <interface.wsdl 
interface="http://xmlns.oracle.com/pcbpel/adapter
           /file/FlatStructureOut/
                 #wsdl.interface(Write_ptt)"/>
    <binding.jca config="FlatStructureOut_file.jca">
      <property name="OutputFileDir" 
             type="xs:string" many="false"
                override="may">C:\outputDir
                        </property>
    </binding.jca>
  </reference>

ノート:

アウトバウンド・ファイル名の長さ(ファイル名と完全なディレクトリ・パスを合せた長さ)は200文字に制限してください。これは厳密な制限ではありませんが推奨事項です。アウトバウンド・ファイル名が長い場合(215文字など)、その名前を持つ空白のファイルがアウトバウンド・ディレクトリに作成されます。

5.3.2.2.2 メディエータでのアウトバウンドの物理または論理ディレクトリ・パスの指定

メディエータでは、アウトバウンド・ディレクトリ名を物理または論理パスとして指定できます。物理パスはc:\inputDirのような値です。

図5-25に示すように、「ファイル・ディレクトリ」ページで設計時に論理名を指定し、「エンドポイント・プロパティ」で論理/物理マッピングを指定できます。たとえば、WriteFileはアウトバウンド・アダプタ・サービスです。設計時には、論理ディレクトリ名としてOutDirを指定しています。

5.3.2.2.3 動的なアウトバウンド・ディレクトリ名の指定

アウトバウンド操作の場合は、動的なアウトバウンド・ディレクトリ名を指定できます。変数を設定すると、動的なアウトバウンド・ディレクトリ名を指定できます。

例 - 変数の設定による動的なアウトバウンド・ディレクトリ名の指定

<?xml version="1.0" encoding="UTF-8"?>
<adapter-config name="ReadAddressChunk" 
                  adapter="File Adapter" 
xmlns="http://platform.integration.oracle
                     /blocks/adapter/fw/metadata">
  <connection-factory location="eis/FileAdapter" 
                     adapterRef=""/>
  <endpoint-interaction operation="ChunkedRead">
    <interaction-spec 
              className=
                 "oracle.tip.adapter.file.outbound.
                   ChunkedInteractionSpec">
      <property name=
              "PhysicalDirectory" value="C:\foo"/>
      <property name="FileName" value="dummy.txt"/>
      <property name="ChunkSize" value="1"/>
    </interaction-spec>
  </endpoint-interaction>
</adapter-config>

この例では、JCAファイルで物理ディレクトリが"C:\foo"に設定されていますが、実行時、このディレクトリ名は割り当てられた値に動的に変更されます。この例では、物理ディレクトリは動的に"C:\out"に変更されます。

動的なアウトバウンド・ディレクトリ名を指定するには、次のステップを実行します。

  1. invokeアクティビティをダブルクリックします。
  2. 「変数の参照」アイコンを選択します。
  3. 「変数チューザ」ダイアログで「オブジェクトの作成」アイコンをクリックします。
  4. 図5-32に示すように、タイプがxsd:stringの変数MyDirを作成します。

    図5-32 「変数の作成」ダイアログ

    図5-32の説明が続きます
    「図5-32 「変数の作成」ダイアログ」の説明
  5. 「コンポーネント」ウィンドウから設計領域のreceiveアクティビティとinvokeアクティビティの間にassignアクティビティをドラッグ・アンド・ドロップします。
  6. assignアクティビティをダブルクリックし、「コピー操作」タブをクリックします。
  7. 「作成」をクリックし、「コピー操作」をクリックします。「コピー操作の作成」ダイアログが表示されます。
  8. 図5-33に示すように、「コピー操作の作成」ダイアログで「タイプ」から「式」を選択してディレクトリ名とパスを指定します。このディレクトリに出力ファイルが書き込まれます。

    図5-33 「コピー操作の作成」ダイアログ

    図5-33の説明が続きます
    「図5-33 「コピー操作の作成」ダイアログ」の説明
  9. 「コピー操作の作成」ダイアログで「OK」をクリックし、「Assign」ダイアログで「OK」をクリックします。「.bpel」ページが表示されます。
  10. invokeアクティビティをダブルクリックします。Invokeダイアログが表示されます。
  11. 「プロパティ」タブをクリックします。
  12. 「プロパティ」列からjca.file.Directoryプロパティを選択し、「値」MyDir (ステップ4で作成したディレクトリ)に設定します。図5-34に示すように、「タイプ」列がinputに設定されていることを確認してください。

    図5-34 「Invoke」ダイアログ

    図5-34の説明が続きます
    「図5-34 「起動」ダイアログ」の説明

ノート:

動的ディレクトリを使用する場合は、NumberMessagesElapsedTimeFileSizeなどのパラメータがアウトバウンド・アダプタ・サービスのWSDLファイルで定義されていないことを確認してください。これらのパラメータは、動的ディレクトリではサポートされていません。

5.3.2.2.4 アウトバウンド・ファイル・ネーミング規則の指定

発信ファイルに使用するネーミング規則を指定します。po.txtなどの完全に静的な名前は入力できません。これは発信ファイル名の一意性を保つためで、ファイルが意図せず上書きされるのを防ぎます。そのかわり、発信ファイル名は静的部分と動的部分で構成されている必要があります。

図5-31に示したファイルの例では、接頭辞と接尾辞の部分は静的です(たとえば、po_および.xml)。名前の%SEQ%変数は動的部分で、順序番号やタイムスタンプ(タイムスタンプのファイルを作成する場合の変数はpo_%yyMMddHHmmss%.xml)になります。

発信ファイルのネーミング規則として、po_で始まり順序番号と拡張子txtが続く名前を選択する場合には、po_%SEQ%.txtと指定する必要があります。

発信ファイルのネーミング規則として、po_で始まりyyyy.MM.ddというパターンのタイムスタンプと拡張子txtが続く名前を選択する場合には、po_%yyyy.MM.dd%.txtと指定する必要があります。たとえば、発信ファイル名はpo_2004.11.29.txtになります。

アウトバウンド・ファイル名に使用できる動的パラメータは1つのみです。つまり、ファイル名で順序番号(%SEQ%)とタイムスタンプのパラメータを組み合せることはできません。

アウトバウンドの同期的読取りには正規表現を使用できません。そのような場合には、正確なファイル名がわかっている必要があります。

タイムスタンプは日付と時間のパターンの文字列で指定します。日付と時間のパターン文字列では、引用符で囲まれていないAからZおよびaからzの文字は、日付または時間の文字列のコンポーネントを表すパターン文字と認識されます。テキストは、解釈されないように一重引用符(')で囲むことができます。文字''は一重引用符を表します。その他すべての文字は解釈されません。

表5-7にJavaのパターン文字の定義を示します。

表5-7 Javaのパターン文字

文字 日付または時刻のコンポーネント 表示内容

G

紀元

テキスト

AD

y

199696

M

年における月

JulyJul07

w

年における週

数値

27

W

月における週

数値

2

D

年における日

数値

189

d

月における日

数値

10

F

月における曜日

数値

2

E

曜日

テキスト

TuesdayTue

a

午前/午後マーカー

テキスト

PM

H

1日における時間(0-23)

数値

0

k

1日における時間(1-24)

数値

24

K

午前/午後における時間(0-11)

数値

0

h

午前/午後における時間(1-12)

数値

12

m

1時間における分

数値

30

s

1分における秒

数値

55

S

ミリ秒

数値

978

z

タイムゾーン

一般的なタイムゾーン

Pacific Standard TimePSTGMT-08:00

Z

タイムゾーン

RFC 822タイムゾーン

-0800

次にパターンの異なる表示内容を示します。

  • テキスト

    書式設定において、パターン文字が4文字以上の場合は、完全な表記が使用されます。それ以外の場合、可能であれば、省略表記が使用されます。解析では、パターン文字の数にかかわらず、どちらの表記も使用できます。

  • 数値

    書式設定において、パターン文字の数は最小桁数になり、これに満たない場合は最小桁数まで0が表示されます。解析において、2つの隣接したフィールドを区別する必要がない場合、パターン文字の数は無視されます。

  • 書式設定において、パターン文字が2文字の場合は、年は2桁に切り捨てられます。それ以外の場合は数値として解釈されます。

解析において、パターン文字が3文字以上の場合は、桁数にかかわらず、年は文字どおりに解釈されます。パターンMM/dd/yyyyを使用すると、01/11/12Jan 11, 12 A.D.と解析されます。

年のパターンが省略されている(yまたはyy)解析において、省略された年は複数の世紀に対して解釈されます。日付は、時間インスタンス作成の80年前から20年後までの間の日付に調整されます。たとえば、パターンMM/dd/yyを使用してJan 1, 1997を作成した場合、文字列05/04/64May 4, 1964と解釈される一方で、文字列01/11/12Jan 11, 2012と解釈されます。解析中、数字が2つ含まれる文字列のみがデフォルトの世紀に解析されます。1桁の文字列、3桁以上の文字列またはすべてが数字ではない2桁の文字列(たとえば-1)など、それ以外の数値文字列は文字どおりに解釈されます。そのため、01/02/3または01/02/003は、同じパターンを使用してJan 2, 3 ADと解析されます。また、01/02/-3Jan 2, 4 BCと解析されます。

  • パターン文字が3桁以上の場合、月はテキストとして解釈されます。それ以外の場合は数値として解釈されます。

  • 一般的なタイムゾーン

    タイムゾーンに名前がある場合はテキストとして解釈されます。GMTオフセット値を表すタイムゾーンの場合、次の構文が使用されます。

   GMTOffsetTimeZone:
      GMT Sign Hours : Minutes
   Sign: one of
      + -
   Hours:
      Digit
      Digit Digit
   Minutes:
      Digit Digit
   Digit: one of
      0 1 2 3 4 5 6 7 8 9

Hours0から23の間で、Minutes00から59の間です。書式設定はロケールに依存せず、数字はUnicode標準のBasic Latinブロックから取得する必要があります。

解析では、RFC 822タイムゾーンも使用できます。

書式設定では、RFC 822の4桁のタイムゾーンが使用されます。

RFC822TimeZone:
      Sign TwoDigitHours Minutes
   TwoDigitHours:
      Digit Digit

TwoDigitHours00から23の間である必要があります。その他の定義は、一般的なタイムゾーンと同じです。

解析では、一般的なタイムゾーンも使用できます。

5.3.2.2.5 動的なアウトバウンド・ファイル名の指定

アウトバウンド操作の場合は、動的なアウトバウンド・ファイル名を指定できます。変数を設定すると、動的なアウトバウンド・ファイル名を指定できます。

例 - 変数の設定による動的なアウトバウンド・ファイル名の指定

<?xml version="1.0" encoding="UTF-8"?>
<adapter-config name="ReadAddressChunk" 
              adapter="File Adapter" 
xmlns="http://platform.integration.oracle/blocks
          /adapter/fw/metadata">
  <connection-factory location=
                     "eis/FileAdapter" 
          adapterRef=""/>
  <endpoint-interaction operation
                   ="ChunkedRead">
    <interaction-spec 
className="oracle.tip.adapter.file.outbound.
          ChunkedInteractionSpec">
      <property name="PhysicalDirectory"
                          value="C:\foo"/>
      <property name="FileName" 
                      value="dummy.txt"/>
      <property name="ChunkSize" value="1"/>
    </interaction-spec>
  </endpoint-interaction>
</adapter-config>

この例では、JCAファイルで物理ディレクトリが"C:\foo"に設定されていますが、実行時、このディレクトリ名は割り当てられた値に動的に変更されます。この例では、物理ディレクトリは動的に"C:\out"に変更されます。動的なアウトバウンド・ディレクトリ名を指定するには、次のステップを実行します。

  1. invokeアクティビティをダブルクリックします。
  2. 「変数の参照」アイコンを選択します。
  3. 「変数チューザ」ダイアログで「オブジェクトの作成」アイコンをクリックします。
  4. 図5-32に示すように、タイプがxsd:stringの変数fileを作成します。
  5. 「コンポーネント」ウィンドウから設計領域のreceiveアクティビティとinvokeアクティビティの間にassignアクティビティをドラッグ・アンド・ドロップします。
  6. assignアクティビティをダブルクリックし、「コピー操作」タブをクリックします。
  7. 「作成」をクリックし、「コピー操作」をクリックします。「コピー操作の作成」ダイアログが表示されます。
  8. 図5-33に示すように、「コピー操作の作成」ダイアログで「タイプ」から「式」を選択してファイル名を指定します。このファイルに出力ファイルが書き込まれます。
  9. 「OK」を数回クリックして、assignアクティビティのダイアログを終了します。
  10. invokeアクティビティをダブルクリックします。Invokeダイアログが表示されます。
  11. 「プロパティ」タブをクリックします。
  12. 「プロパティ」列からjca.file.FileNameプロパティを選択し、「値」file(ステップ4で作成したファイル)に設定します。図5-35に示すように、「タイプ」列がinputに設定されていることを確認してください。

    図5-35 「Invoke」ダイアログ

    図5-35の説明が続きます
    「図5-35 「起動」ダイアログ」の説明

ノート:

動的ファイルを使用する場合は、NumberMessagesElapsedTimeFileSizeなどのパラメータがアウトバウンド・アダプタ・サービスのWSDLファイルで定義されていないことを確認してください。これらのパラメータは、動的ファイルではサポートされていません。

5.3.2.2.6 複数のアウトバウンド・メッセージのバッチ処理

最も簡単なシナリオの場合、1つのメッセージに1つのファイルの書込みを指定します。また、バッチ・ファイル書込みに関するアウトバウンドの規則も指定できます。これにより、1つのバッチ・ファイルでパブリッシュするメッセージ数を指定できます。次に示すバッチ・ファイルの設定は、図5-31の「ファイル構成」ページで指定されています。

  • メッセージ数の到達

    到達した際に新しい発信ファイルを作成する値を指定します。

  • 経過時間の超過

    超過した際に新しい発信ファイルを作成する値を指定します。

    ノート:

    「経過時間の超過」バッチ処理基準が評価されて新しい発信ファイルが作成されるのは、起動の発生時のみです。

    たとえば、「経過時間の超過」を15秒に指定した場合、最初に受信したメッセージは、バッチ処理条件が有効でないため15秒が経過しても書き込まれません。第2のメッセージを受信すると、第1のメッセージに対してバッチ処理条件が有効になり、経過時間が15秒を超過した時点で出力ファイルが作成されます。

  • ファイル・サイズの超過

    到達した際に発信ファイルを作成するファイル・サイズを指定します。たとえば、受信したメッセージ数に3を、ファイル・サイズに1MBという値を指定したとします。合計すると1MB以上になる2つのメッセージや、1MBに満たない3つのメッセージを受信した場合に、出力ファイルが作成されます。

ノート:

JCAファイル内の前述のリストに指定されているファイル構成を手動で変更しないでください。これらの構成を変更するには、アダプタ構成ウィザードを使用する必要があります。

バッチ処理中にOracleファイル・アダプタに問題が発生した場合、リカバリでは中断した場所からバッチ処理が開始されます。

5.3.2.3 ネイティブ・データ変換

次に表示されるアダプタ構成ウィザードのページは、図5-36に示す「メッセージ」ページです。このページでは、変換用のXSDスキーマ・ファイルを選択できます。

図5-36 スキーマの指定

図5-36の説明が続きます
「図5-36 スキーマの指定」の説明

インバウンド方向のスキーマの指定と同様に、このページでは次のタスクを実行できます。

  • ネイティブ・フォーマット変換の要不要の指定

  • 変換用のXSDスキーマ・ファイルの選択

  • CSV、固定長、DTDおよびCOBOLコピーブックなどのファイル形式からXSDファイルの作成が可能なネイティブ・フォーマット・ビルダー・ウィザードの起動

「メッセージ」ページの詳細は、「ネイティブ・データ変換」を参照してください。

5.3.2.4 アウトバウンド・サービス・ファイル

アダプタ構成ウィザードを使用したOracleファイル・アダプタの構成が完了すると、アウトバウンド操作用のWSDLJCAのファイルのペアが生成されます。ファイル名は、図2-8に示すアダプタ構成ウィザードの「サービス名」ページで指定したサービス名と同じです。後からウィザードを再起動して、操作定義を変更できます。

サンプルのアウトバウンドJCAファイルには、表5-8に記載されている情報が格納されます。

表5-8 アウトバウンド・サービスのサンプルのJCAプロパティ

プロパティ 値の例

PhysicalDirectory

/tmp/flat/OutputDir

FileNamingConvention

address-csv%SEQ%.txt

Append

true

NumberMessages

1

ConcurrentThreshold

0

OpaqueSchema

false

アウトバウンドOracleファイル・アダプタでは、次の構成パラメータが使用されます。

  • PhysicalDirectory

  • LogicalDirectory

  • NumberMessages

  • ElapsedTime

  • FileSize

  • FileNamingConvention

  • Append

これらの構成プロパティの詳細は、「Oracle JCAアダプタのプロパティ」を参照してください。

5.3.2.5 アウトバウンド・ヘッダー

ペイロードを除いて、Oracleファイル・アダプタは次のヘッダーをコンポーネントから受信します。 

  • jca.file.FileName: ファイル名

  • jca.file.Directory: ディレクトリ名

5.3.3 Oracleファイル・アダプタの同期読取りの説明

アウトバウンド方向では、Oracleファイル/FTPアダプタは1つのファイルのコンテンツを読み取ることができます。この項では、Oracleファイル・アダプタのアウトバウンドの同期ファイル読取り機能の概要について説明します。ファイルを同期的に読み取るには、図5-37に示すように「同期Read File」操作を選択します。

図5-37 同期読取り操作のページ

図5-37の説明が続きます
「図5-37 同期読取り操作のページ」の説明

アウトバウンド方向では、Oracleファイル/FTPアダプタを使用すると、同期ファイル読取り操作を使用して1つのファイルのコンテンツを読み取ることができます。この操作により、ファイルを添付として読み取ることができるようになりました。ファイルを添付として読み取るためのチェック・ボックスを選択します。添付に対する残りのオプションは任意指定であり、サービス・エンジンでこれらの情報が必要な場合に役立ちます。

アダプタ構成ウィザードのページの多くは、「ファイル名」ページを除いて、ファイル読取り操作の場合と同様です。図5-38に示すように、「ファイル名」フィールドでは読み取るファイルの名前を指定できます。

図5-38 「ファイル・ディレクトリ」ページ

図5-38の説明が続きます
「図5-38 「ファイル・ディレクトリ」ページ」の説明

5.3.4 Oracleファイル・アダプタのファイル・リスティングの説明

Oracleファイル・アダプタのこの機能では、BPELアクティビティを使用してターゲット・ディレクトリからファイルのリストを取得します。このファイルのリストはXML文書として返され、ファイル名、ディレクトリ名、ファイル・サイズ、最終変更時間などの情報が記載されています。この項では、Oracleファイル・アダプタのファイル・リスティング機能の概要について説明します。BPELプロセスまたはメディエータ・サービスでOracleファイル・アダプタを使用するように構成するには、アダプタ構成ウィザードを使用します。これにより、アウトバウンドのWSDLJCAのファイルのペアが作成されます。

ノート:

標準Java APIには作成時間を取得するためのメカニズムがないため、ファイル作成時間プロパティcreationTimeはサポートされていません。creationTimeプロパティの値は常に0として表示されます。

たとえば、

<creationTime xmlns="http://xmlns.oracle.com
/pcbpel/adapter/file/FAListFiles/FAListFilesTest/ReadS/">
0</creationTime> 

この項には次のトピックが含まれます:

5.3.4.1 リスト表示操作

ファイルのリストを表示するには、図5-39に示すように「List Files」操作を選択する必要があります。

図5-39 List Files操作のページ

図5-39の説明が続きます
「図5-39 List Files操作のページ」の説明
5.3.4.2 ファイル・ディレクトリの指定

図5-40に示すアダプタ構成ウィザードの「ファイル・ディレクトリ」ページでは、リスト表示操作のファイル名の読取りに使用するディレクトリの情報を指定できます。ディレクトリ内のファイルを再帰的にリスト表示することもできます。

図5-40 アダプタ構成ウィザード - 着信ファイルの指定

図5-40の説明が続きます
「図5-40 アダプタ構成ウィザード - 着信ファイルの指定」の説明

次の項では、指定するファイル・ディレクトリ情報について説明します。

5.3.4.2.1 SOAコンポジットでのインバウンドの物理または論理ディレクトリ・パスの指定

Oracle BPEL PMメディエータが関係するコンポジットでは、ディレクトリ名を物理パスまたは論理パスとして指定できます。物理パスはC:\inputDirのような値です。

コンポジットでは、論理プロパティはJCAファイルで指定され、その論理/物理マッピングはバインディング・プロパティを使用して解決されます。設計時に必要なディレクトリを指定し、必要に応じて後からディレクトリ名を変更できます。

たとえば、論理入力ディレクトリ名がC:\inputDirの場合、生成されるJCAファイルは次のようになります。

例 - 論理入力ディレクトリに対して生成される.jcaファイル

<adapter-config name="ListFiles"
       adapter="File Adapter" 
   xmlns="http://platform.integration.oracle
   /blocks/adapter/fw/metadata">
  
  <connection-factory location="eis/FileAdapter"
          UIincludeWildcard="*.txt" 
adapterRef=""/>
  <endpoint-interaction portType="FileListing_ptt" 
          operation="FileListing">
    <interaction-spec 
className="oracle.tip.adapter.file.
          outbound.FileListInteractionSpec">
      <property name="PhysicalDirectory" 
           value="C:\inputDir"/>
      <property name="Recursive" value="true"/>
      <property name="IncludeFiles" value=".*\.txt"/>
    </interaction-spec>
  </endpoint-interaction>
 
</adapter-config>
5.3.4.3 ファイルの検索

図5-41に示すアダプタ構成ウィザードの「ファイルのフィルタ処理」ページでは、取得または無視するファイルの詳細を指定できます。

Oracleファイル・アダプタはファイル・リスナーとして機能し、ローカルまたはリモートのファイル・システムの指定されたディレクトリをポーリングして、指定されたネーミング基準に一致するファイルを検索します。

図5-41 「アダプタ構成ウィザード - ファイルのフィルタ処理」

図5-41の説明が続きます
「図5-41 「アダプタ構成ウィザード - ファイルのフィルタ処理」ページ」の説明

次の項では、指定するファイル・フィルタ処理情報について説明します。

5.3.4.3.1 ネーミング・パターンの指定

Oracleファイル・アダプタがインバウンド・ファイルのポーリングに使用するネーミング規則を指定します。また、処理対象外にするファイルのネーミング規則も指定できます。2つのネーミング規則を選択できます。Oracleファイル・アダプタにより、インバウンド・ディレクトリに配置されるファイルが検索されます。

  • ファイル・ワイルドカード(po*.txt)

    poで始まり.txtで終わるすべてのファイルが取得されます。この規則はオペレーティング・システムの標準に準拠しています。

  • 正規表現(po.*\.txt)

    poで始まり .txtで終わるすべてのファイルが取得されます。この規則は、Java Development Kit (JDK)の正規表現(regex)構文に準拠しています。

ノート:

  • 後から別のネーミング・パターンを選択する場合は、「インクルード・ファイルの名前パターン」および「処理対象外ファイルの名前パターン」フィールドで指定するネーミング規則も変更してください。アダプタ構成ウィザードにより自動的に変更されることはありません。

  • ファイルを取得する際、検索対象として*.*指定しないでください。

  • オペレーティング・システムにより設定されているファイルの長さの制限に注意してください。たとえば、Windowsオペレーティング・システムでは、ファイル名(ファイル名と完全なディレクトリ・パスを合せた長さ)を256文字より長くできません。制限によりファイル名に特定の文字を使用できないオペレーティング・システムもあります。たとえば、Windowsオペレーティング・システムでは、バックスラッシュ(\)、スラッシュ(/)、コロン(:)、アスタリスク(*)、左角カッコ(<)、右角カッコ(>)または縦線(|)などの文字は許可されていません。

5.3.4.3.2 処理対象ファイルと処理対象外ファイル

正規表現を使用する場合、「インクルード・ファイルの名前パターン」および「処理対象外ファイルの名前パターン」フィールドで指定する値は、JDKの正規表現(regex)構文に準拠している必要があります。どちらのフィールドにも、異なるregexパターンを別々に指定する必要があります。「インクルード・ファイルの名前パターン」フィールドおよび「処理対象外ファイルの名前パターン」フィールドは、インバウンドWSDLファイルのIncludeFilesおよびExcludeFilesパラメータに対応します。

ノート:

regexパターンはJDK regexパターンに準拠しています。JDK regexパターンに準じると、任意の文字列が任意の回数発生するパターンの正しいコノテーションはピリオドとプラス記号です(.+)。JDK regexでは、アスタリスク(*)は任意の文字が任意の回数発生する文字列のプレースホルダではありません。

インバウンドOracleファイル・アダプタで、poで始まり、拡張子がtxtであるすべてのファイル名を取得するには、名前パターンが正規表現である場合は、「インクルード・ファイルの名前パターン」フィールドでpo.*\.txtとして指定する必要があります。次にこのregexパターンの例で使用された記号の意味を示します。

  • ピリオド(.)は任意の文字を表します。

  • アスタリスク(*)は任意の発生数を表します。

  • ピリオドが続くバックスラッシュ(\.)は、エスケープ文字のバックスラッシュで示されているように、文字としてのピリオド(.)を表します。

「処理対象外ファイルの名前パターン」フィールドも同様に構成します。

「インクルード・ファイルの名前パターン」フィールドと「処理対象外ファイルの名前パターン」フィールドの式に重複がある場合、処理対象外ファイルの式が優先されます。たとえば、「インクルード・ファイルの名前パターン」がabc*.txtに設定され、「処理対象外ファイルの名前パターン」がabcd*.txtに設定されている場合、接頭辞abcd*.txtが付いたファイルはすべて受信されます。

ノート:

JDK regexのパターン名を、プラス記号(+)、疑問符(?)またはアスタリスク(*)で始めることはできません。

Java regex構文の詳細は、次のサイトを参照してください。

http://java.sun.com/j2se/1.5.0/docs/api

ノート:

ファイルは読み取られないため、ネイティブ・データ変換は行われません。

5.3.5 Oracle FTPアダプタのGet Fileの説明

インバウンド方向では、Oracle FTPアダプタOracleファイル・アダプタのRead File操作と同様に機能し、処理のためにファイル・システムのファイルをポーリングして取得します。主な違いは、Oracle FTPアダプタがリモートでのファイル交換に使用されることです。FTPアダプタをリモートでのファイル交換用に構成するために、図5-42に示すように、アダプタ構成ウィザードでは後で使用するFTPサーバーへの接続情報が求められます。

図5-42 FTPサーバーの接続情報の指定

図5-42の説明が続きます
「図5-42 FTPサーバーの接続情報の指定」の説明

デフォルトのアダプタ・インスタンスのJNDI名はeis/Ftp/FtpAdapterです。または、カスタム名を使用します。この名前で、実行時にFTPサーバーに接続します。

ノート:

Oracle FTPアダプタでは、大きなファイルの転送時にFTPコマンドのRESTARTRECOVERYを使用できません。

ログイン後、Get File(読取り)操作と配信するファイル・タイプを選択します。図5-43にこの選択内容を示します。

図5-43 「Get File」操作の選択

図5-43の説明が続きます
「図5-43 「Get File」操作の選択」の説明

デプロイメント・ディスクリプタのserverTypeプロパティは、データ転送時に行セパレータを判別するために使用されます。プロパティ値としてunixwinまたはmacを指定できます。これらの値は、FTPサーバーが稼働しているオペレーティング・システムを表します。デフォルトでは、serverTypeプロパティの値はunixです。

macを指定すると、行セパレータとして\rが使用されます。unixを指定すると\nが使用され、winを指定すると\r\nが使用されます。アウトバウンド操作時に行セパレータを書き込むために、NXSDトランスレータ・コンポーネントによってこのプロパティが使用されることに注意してください。

これ以降のGet File操作のアダプタ構成ウィザードのページは、ファイルのRead File操作のページと同じです。表5-9は、表示されるページと各機能の説明が記載されている項を示しています。

表5-9 Get File操作のアダプタ構成ウィザードのページ

ページ 参照項目

ファイル・ディレクトリ(図5-25)

インバウンド・ファイル・ディレクトリの指定

ファイルのフィルタ処理(図5-26)

ファイルの検索とバッチ処理

ファイル・ポーリング(図5-27)

ファイル・ポーリング

メッセージ(図5-28)

ネイティブ・データ変換

上級ユーザーは、その他のアダプタ構成ウィザードのページを使用することもできます。それが図5-44のページで、図5-27の「ファイル・ポーリング」ページで次のいずれかまたは両方の選択を行った後にのみ表示されます:

  • 「正常な取得後にファイルを削除」チェック・ボックスの選択を解除

  • 「ファイルの最小経過時間」フィールドの値を0より大きな値に設定

図5-44 ファイル変更時間

図5-44の説明が続きます
「図5-44 ファイル変更時間」の説明

このページでは、リモートFTPサーバー上のファイルの変更時間を取得する方法を指定できます。

ノート:

Oracle FTPアダプタでは、タイムスタンプのリスト表示と取得にNLSTではなくLISTコマンドが使用されますが、これは時間の書式の指定が不要であるためです。ただし、次のいずれかを行う場合は、示されているように時間の書式を指定する必要があります。

  • リスト表示のコマンドとしてNLSTを指定する場合(マッピング・ファイルを使用するか、インバウンドJCAファイルでUseNlst="true"パラメータを使用)

  • 「ファイル名サブストリング」オプションを使用する場合

これらのカテゴリに該当しない場合、このノートは適用されません。

  • ファイル・システム

    このオプションを使用すると、ファイル・システムのリスト・コマンドを使用してファイルの変更時間を日付/時間の書式で取得できます。ただし、このオプションはあまり使用されず、サポートしていないFTPサーバーもあります。使用しているサーバーでファイル・システムのリスト・コマンドがサポートされているかどうか、どのコマンドライン構文を使用するか、およびどのように出力を解析するかは、FTPサーバーのドキュメントを参照してください。

    たとえば、ファイル・システムのリスト・コマンドquote mdtm filenameがサポートされており、次の情報が返ってきたとします。

    213 20050602102633
    

    開始索引、終了索引およびファイル変更時間の日付/時間の書式をカンマ区切りの単一の値(4,18,yyyyMMddHHmmssなど)として日付書式/時間書式フィールドに指定します。

    説明:

    • 4はファイル変更時間の開始索引です。

    • 18はファイル変更時間の終了索引です。

    • yyyyMMddHHmmssは、quote mdtm filenameコマンドで取得されたファイル変更時間の日付/時間の書式です。

    結果のJCAファイルには、次のパラメータと値が含まれます。

    <property name=" FileModificationTime " value=" FileSystem "/>
    <property name=" ModificationTimeFormat" value=" 4,18,yyyyMMddHHmmss "/>
    

    タイムゾーンの問題を処理するには、タイムスタンプの違いを理解している必要があります。FTPサーバーのタイムゾーンは、Windowsの「日付と時刻のプロパティ」(たとえば、Windowsのタスク・バーに表示されている時刻をダブルクリック)を使用して決定されます。Oracle FTPアダプタを実行しているシステムとFTPサーバーの時差をミリ秒に換算し、その値をcomposite.xmlファイルのバインディング・プロパティとして追加します。

    <binding.jca config="FlatStructureIn_file.jca">
       <property name="timestampOffset" source="" type="xs:string" many="false" 
    override="may">238488888</property-->
    </binding.jca>
    
  • ディレクトリ・リスティング

    このオプションを使用すると、FTPディレクトリ・リスティング・コマンドを使用してファイル変更時間から日付/時間書式を取得できます。たとえば、ディレクトリ・リスティング・コマンド(ls -l)で次の情報が返ってきたとします。

    12-27-04  07:44AM                 2829 NativeData2.txt
    

    開始索引、終了索引およびファイル変更時間の日付/時間の書式を、カンマ区切りの単一の値(0,17, MM-dd-yy hh:mmaなど)として、「旧ファイルの日付書式/時刻書式」フィールドまたは「最新ファイルの日付書式/時刻書式」フィールドに指定します。

    説明:

    • 0はファイル変更時間の開始索引です。

    • 17はファイル変更時間の終了索引です。

    • MM-dd-yy hh:mmaは、ls -lコマンドで取得されたファイル変更時間の日付/時間のフォーマットです。この例では、「最新ファイルの日付書式/時刻書式」フィールドに値が入力されています。このフィールドはネーミング規則に準拠しており、書式が最新のファイルから取得されたことを意味します。一方、「旧ファイルの日付書式/時刻書式」フィールドでは最も古いファイルから書式が取得されます。

    結果のJCAファイルには、次のパラメータと値が含まれます。

    <property name=" FileModificationTime " value=" DirListing"/>
    <property name=" ModificationTimeFormat" value="0,17, MM-dd-yy hh:mma "/>
    

    タイムゾーンの問題を処理するには、タイムスタンプの違いを理解している必要があります。FTPサーバーのタイムゾーンは、Windowsの「日付と時刻のプロパティ」(たとえば、Windowsのタスク・バーに表示されている時刻をダブルクリック)を使用して決定されます。Oracle FTPアダプタを実行しているシステムとFTPサーバーの時差をミリ秒に換算し、その値をcomposite.xmlファイルのバインディング・プロパティとして追加します。

    <binding.jca config="FlatStructureIn_file.jca">
       <property name="timestampOffset" source="" type="xs:string" many="false" 
    override="may">238488888</property-->
    </binding.jca>
    
  • ファイル名サブストリング

    このオプションを使用すると、ファイル名から変更時間を取得できます。たとえば、ファイル名がfixedLength_20050324.txtの場合、次の値を指定できます。

    • 「サブストリング開始索引」フィールドに開始索引を指定できます(12など)。

    • 「終了索引」フィールドの終了索引(20など)

    • ファイル名でファイル変更時間を表すためにJavaのSimpleDateFormatに準拠している「日付書式/時間書式」フィールドの日付と時間の書式(yyyyMMddなど)

    結果のJCAファイルには、次のパラメータと値が含まれます。

    <property name=" FileModificationTime " value=" Filename"/>
    <property name=" FileNameSubstringBegin " value="12 "/>
    <property name=" FileNameSubstringEnd " value="20"/>
    <property name=" ModificationTimeFormat " value=" yyyyMMdd "/>
    

「アダプタ構成ウィザード」を完了すると、JDeveloperの「アプリケーション」セクションに構成ファイルが作成されます。

エラー処理の詳細は、図2-28を参照してください。

また、次のサンプルに示すように、DefaultDateFormatパラメータおよびRecentDateFormatパラメータをOracle FTPアダプタのデプロイメント・ディスクリプタに追加することも必要となります。

<non-managed-connection 
managedConnectionFactoryClassName=
          "oracle.tip.adapter.ftp.
             FTPManagedConnectionFactory">
   <property name="host" value="localhost"/>
   <property name="port" value="21"/>
   <property name="username" value="****"/>
   <property name="password" value="****"/>
    <property name="listParserKey" value="UNIX"/>
    <property name="defaultDateFormat"
                   value="MMM d yyyy"/>
    <property name="recentDateFormat"
                   value="MMM d HH:mm"/>
</non-managed-connection>

DefaultDateFormatパラメータおよびRecentDateFormatパラメータの詳細は、Oracleファイル/FTPアダプタのディレクトリ内のファイルの再帰的処理」を参照してください。

5.3.6 Oracle FTPアダプタのPut Fileの説明

アウトバウンド方向では、Oracle FTPアダプタOracleファイル・アダプタのWrite File操作と同様に機能します。Oracle FTPアダプタはBPELプロセスまたはメディエータ・サービスからメッセージを受信し、ファイル内のメッセージをファイル・システム(この場合はリモート)に書き込みます。メッセージをリモート・システムに書き込む必要があるため、図5-42に示すように、アダプタ構成ウィザードではアダプタ・インスタンスのJNDI名でFTPサーバーに接続するように求められます。

ログイン後、Put File(書込み)操作と配信するファイル・タイプを選択します。図5-45にこの選択内容を示します。

図5-45 「Put File」操作の選択

図5-45の説明が続きます
「図5-45 「Put File」操作の選択」の説明

これ以降のPut File操作のアダプタ構成ウィザードのページは、Oracleファイル・アダプタのWrite File操作のページと同じです。表5-10に、表示されるページとその機能の説明が記載されている項を示します。

表5-10 Put File操作のアダプタ構成ウィザードのページ

ページ 参照項目

ファイル構成(図5-31)

アウトバウンド・ファイル・ディレクトリの作成

メッセージ(図5-36)

ネイティブ・データ変換

「アダプタ構成ウィザード」を完了すると、JDeveloperの「アプリケーション」セクションに構成ファイルが作成されます。

5.3.7 Oracle FTPアダプタの同期Get Fileの説明

アウトバウンド方向では、Oracle FTPアダプタOracleファイル・アダプタの同期Read File操作と同様に機能し、ファイル・システムのファイルをポーリングして取得し、ファイルの現在のコンテンツを読み取ります。主な違いは、Oracle FTPアダプタがリモートでのファイル交換に使用されることです。このポーリングのため、アダプタ構成ウィザードでは後で使用するFTPサーバーへの接続情報が求められます。ファイルを同期的に読み取るには、図5-46に示すように「同期Get File」操作を選択します。

図5-46 「同期Get File」操作の選択

図5-46の説明が続きます
「図5-46 「同期Get File」操作の選択」の説明

5.3.8 Oracle FTPアダプタのファイル・リスティングの説明

Oracle FTPアダプタのファイル・リスティングの概要は、「ファイル・リスティングの説明」に記載されているOracleファイル・アダプタのファイル・リスティングの概要と似ています。Oracle FTPアダプタはターゲット・ディレクトリのファイルをポーリングし、ファイルのリストを指定されたFTPの場所に表示します。ファイルのコンテンツは読み取られません。Oracle FTPアダプタのこの機能では、invokeアクティビティを使用してターゲット・ディレクトリからファイルのリストを取得します。このファイルのリストはXML文書として返され、ファイル名、ディレクトリ名、ファイル・サイズ、最終変更時間などの情報が記載されています。

ノート:

標準Java APIには作成時間を取得するためのメカニズムがないため、FTPの場合、ファイル作成時間プロパティcreationTimeはサポートされていません。creationTimeプロパティの値は常に0として表示されます。

creationTimeプロパティは、SFTPの場合にのみサポートされています。

BPELプロセスまたはメディエータ・サービスでOracle FTPアダプタを使用するように構成するには、アダプタ構成ウィザードを使用します。これにより、アウトバウンドのWSDLJCAのファイルのペアが作成されます。

ファイルのリストを表示するには、アダプタ構成ウィザードの「操作タイプ」ページで「List Files」操作を選択します。アダプタ構成ウィザードの「ファイル・ディレクトリ」ページでは、リスト表示操作のファイル名の読取りに使用するディレクトリの情報を指定する必要があります。ディレクトリ内のファイルを再帰的にリスト表示することもできます。アダプタ構成ウィザードの「ファイルのフィルタ処理」ページでは、取得または無視するファイルの詳細を指定できます。

Oracle FTPアダプタはリスナーとして機能し、ローカルまたはリモートのファイル・システムの指定されたディレクトリをポーリングして、指定されたネーミング基準に一致するファイルを検索します。

5.3.9 ファイル/FTPアダプタの拡張

ファイル/FTPアダプタの拡張は4つあります。

  • デフォルトのFTPClient実装のlogin()操作に対するFTPアダプタ拡張

    MLSDコマンドをサポートするためのFTPアダプタ拡張

  • LISTコマンドではなくMLSDコマンドを送信するためのリスティング操作を拡張するFTPアダプタ拡張

  • MVSプラットフォームで実行されているFTPサーバーに追加の固有FTPコマンドを送信するためのFTP格納操作に対するFTPアダプタ拡張

これらの各拡張については、ファイル/FTPアダプタの使用例で詳しく説明します。

5.4 Oracleファイル/FTPアダプタの構成

次の各項では、Oracleファイル/FTPアダプタの各種構成タスクについて説明します。

ノート:

  • OracleファイルおよびFTPアダプタを構成する前に、ファイル/FTPアダプタのチューニングおよびOracleファイルおよびFTPアダプタのプロパティの情報を参照してください。

  • ftpAbsolutePathBeginパラメータを使用して、FTPアダプタが発行したFTPコマンドで使用されたディレクトリ名が、絶対ディレクトリか相対ディレクトリかをアダプタに示すことができます。ディレクトリ名がftpAbsolutePathBeginで始まっている場合は絶対ディレクトリで、それ以外の場合は相対ディレクトリとして扱われます。

ノート:

nodemanager.propertieslocalhostのかわりに、リスニング用のホストのIPアドレスを使用します。localhostを使用すると、SOAおよびMFTプロセスは権限の問題で書込みおよび読取りを行うことができません。詳細は、「ノード・マネージャの使用」を参照してください

5.4.1 リモートFTPサーバーにアクセスするための資格証明の構成

リモートFTPサーバーにアクセスするには、次の資格証明を構成する必要があります。

  • ユーザー名: リモートFTPサーバーで使用するユーザー名

  • パスワード: リモートFTPサーバーで使用するパスワード

  • ポート: 21

  • ホスト: リモートFTPサーバーのIPアドレス

これらの資格証明を構成するには、Oracle WebLogic Serverコンソールを使用してweblogic-ra.xmlファイルを変更する必要があります。

これを行うには、Oracle WebLogic Server管理コンソールで次の手順を実行します。

  1. 左側のナビゲーション・ペインから、「デプロイメント」を選択します。
  2. 右側に表示されるデプロイメントの表から、「FtpAdapter」を選択します。
  3. FtpAdapterの「構成」サブタブを選択し、「アウトバウンド接続プール」を選択します。
  4. javax.resource.cci.ConnectionFactoryを展開し、変更するインスタンスを選択します。(たとえば、非高可用性の使用例では、eis/Ftp/FtpAdapterインスタンスを選択します。)

5.4.2 高可用性のためのOracleファイル/FTPアダプタの構成

次の各項では、アクティブ/アクティブ・トポロジに対する高可用性のためにOracleファイル/FTPアダプタを構成する際の要件と手順について説明します。

5.4.2.1 高可用性の前提条件

高可用性を実現するようにOracleファイル/FTPアダプタを構成するには、次の前提条件が満たされていることを確認する必要があります。

  • クラスタリングされた複数のプロセスで、同じ物理ディレクトリが使用されている必要があります。

  • connection-factoryでコントロール・ディレクトリと同じ共有ディレクトリが指定され、その名前が一致している必要があります。たとえば、一方のconnection-factoryのデプロイメント・ディスクリプタでcontrolDirの値として/shared/control_dirが指定されている場合は、もう一方のデプロイメント・ディスクリプタでも同じ値が指定されている必要があります。

  • OracleファイルおよびFTPアダプタでは、高可用性ファイルがルート・フォルダの直下に置かれている場合にはそのファイルはロックされません。高可用性機能を使用するには、rootの下のサブフォルダにファイルを配置してください。

  • アダプタを正常に機能させるために、リモート・フォルトに対するフォルト・ポリシーとフォルト・バインディングが作成されている必要があります。フォルト・ポリシーとフォルト・バインディングの詳細は、「エラー処理」を参照してください。

  • JCAファイル内にMaxRaiseSizeプロパティを設定する必要があります。

ノート:

大きなペイロードについては、次の設定を追加してSOADataSourceのトランザクション・タイムアウトを増やす必要があります。

<xa-set-transaction-timeout>true</xa-set-transaction-timeout>
<xa-transaction-timeout>1000</xa-transaction-timeout> 

ノート:

Windowsプラットフォームの場合は、入力ディレクトリと出力ディレクトリが正規化されていることを確認する必要があります。たとえば、c:\bpel\inputのかわりにC:\bpel\inputを使用する必要があります。c:のかわりに大文字のドライブ名C:を使用することに注意してください。

ノート:

すべてのプラットフォームで、入力ディレクトリ名または出力ディレクトリ名をJavaシステム・プロパティfile.separator値で終了しないようにしてください。たとえば、/tmp/file/in/はファイル・セパレータのスラッシュが末尾にあるため無効ですが、/tmp/file/inは有効です。

5.4.2.2 インバウンド操作の高可用性

Oracleファイル/FTPアダプタでは、必ず1つのノードのみが分散トポロジ内の特定ファイルを処理するようにする必要があります。データベース表をコーディネータとして使用して、Oracleファイル/FTPアダプタのインバウンド操作に対する高可用性を確保できます。

5.4.2.2.1 コーディネータとしてのデータベース表の使用

データベース表をコーディネータとして使用して、インバウンドのOracleファイル/FTPアダプタ・サービスの可用性を高めるには、次の手順を使用します。

ノート:

データベースをコーディネータとして使用する場合は、グローバル・トランザクション・タイムアウトの値を大きくする必要があります。

  1. データベース表の作成

    データベース・スキーマはsoainfraの一部として事前作成されているため、このステップを実行する必要はありません。

  2. Oracleファイル・アダプタのデプロイメント・ディスクリプタの変更

    Oracle WebLogic Server管理コンソールで、eis/HAFileAdapterに対応するconnection-instanceのOracleファイル・アダプタのデプロイメント・ディスクリプタを変更します。

    1. Oracle WebLogic Server管理コンソールにログインします。コンソールにアクセスするには、http://servername:portnumber/consoleにナビゲートします。

    2. 「ドメイン構造」の左ペインで「デプロイメント」をクリックします。

    3. 右ペインの「デプロイメントのサマリー」「FileAdapter」をクリックします。

    4. 「構成」タブをクリックします。

    5. 「アウトバウンド接続プール」タブをクリックし、javax.resource.cci.ConnectionFactoryを開いて図5-47に示すように構成済のコネクション・ファクトリを表示します。

      図5-47 Oracle WebLogic Server管理コンソール - 「FileAdapterの設定」ページ

      図5-47の説明が続きます
      「図5-47 Oracle WebLogic Server管理コンソール - 「FileAdapterの設定」ページ」の説明
    6. 「eis/HAFileAdapter」をクリックします。高可用性に対応する接続ファクトリの「アウトバウンド接続のプロパティ」が表示されます。

    7. 図5-48に示すようにコネクション・ファクトリのプロパティを更新します。

      図5-48 Oracle WebLogic Server管理コンソール - 「javax.resource.cci.ConnectionFactoryの設定」ページ

      図5-48の説明が続きます
      「図5-48 Oracle WebLogic Server管理コンソール - 「javax.resource.cci.ConnectionFactoryの設定」ページ」の説明

      Oracleファイル/FTPアダプタのコネクション・ファクトリの新しいパラメータは次のとおりです。

      controlDir - 制御ファイルを格納するディレクトリ構造に設定します。1つのクラスタ内で複数のWebLogic Serverインスタンスを実行する場合は、共有の場所に設定する必要があります。

      inboundDataSource - 値をjdbc/SOADataSourceに設定します。これは、高可用性に対応するスキーマを事前に作成する場所であるデータ・ソースです。事前作成されたスキーマ・ファイルは、$BEA_HOME/AS11gR1SOA/rcu/integration/soainfra/sql/adapter/createschema_adapter_oracle.sqlで参照できます。それ以外の場所にスキーマを作成するには、このスクリプトを使用します。別のスキーマを選択した場合は、それに応じてinboundDataSourceプロパティを設定する必要があります。

    8. 次の例に示すように、コネクション・ファクトリを使用するためにBPELプロセスまたはメディエータのシナリオを構成します。

      <adapter-config name="FlatStructureIn" 
                           adapter="File Adapter" 
      xmlns="http://platform.integration.                oracle/blocks/adapter/fw/metadata">
        <connection-factory location=
                            "eis/HAFileAdapter" 
      UIincludeWildcard="*.txt" adapterRef=""/>
        <endpoint-activation portType="Read_ptt"
                                 operation="Read">
          <activation-spec 
      className="oracle.tip.adapter.                   file.inbound.FileActivationSpec"../>
            <property../>
            <property../>
          </activation-spec>
        </endpoint-activation>
      </adapter-config>

      ノート:

      接続ファクトリの位置属性は、eis/HAFileAdapterに設定されています。

5.4.2.3 アウトバウンド操作の高可用性

Oracleファイル/FTPアダプタでは、複数の参照が同じディレクトリに書き込まれた場合に相互にオーバーライドされないようにする必要があります。次のロック機能を使用すると、アウトバウンド操作でのOracleファイル/FTPアダプタの可用性が向上します。

  • データベースmutex

  • ユーザー定義mutex

5.4.2.3.1 データベースMutexの使用

データベース表をコーディネータとして使用して、アウトバウンドのOracleファイル/FTPアダプタ・サービスの可用性を高めるには、次の手順を使用します。

ノート:

データベースをコーディネータとして使用する場合は、グローバル・トランザクション・タイムアウトを増やす必要があります。

  1. データベース表の作成

    データベース・スキーマはsoainfraの一部として事前作成されているため、このステップを実行する必要はありません。

  2. Oracleファイル・アダプタのデプロイメント・ディスクリプタの変更

    Oracle WebLogic Server管理コンソールで、eis/HAFileAdapterに対応するconnection-instanceのOracleファイル・アダプタのデプロイメント・ディスクリプタを変更します。

    1. Oracle WebLogic Server管理コンソールにログインします。コンソールにアクセスするには、http://servername:portnumber/consoleにナビゲートします。

    2. 「ドメイン構造」の左ペインで「デプロイメント」をクリックします。

    3. 右ペインの「デプロイメントのサマリー」「FileAdapter」をクリックします。

    4. 「構成」タブをクリックします。

    5. 「アウトバウンド接続プール」タブをクリックし、javax.resource.cci.ConnectionFactoryを開いて図5-47に示すように構成済のコネクション・ファクトリを表示します。

    6. 「eis/HAFileAdapter」をクリックします。高可用性に対応するコネクション・ファクトリの「アウトバウンド接続のプロパティ」ページが表示されます。

    7. 図5-49に示すようにコネクション・ファクトリのプロパティを更新します。

      図5-49 Oracle WebLogic Server管理コンソール - 「javax.resource.cci.ConnectionFactoryの設定」ページ

      図5-49の説明が続きます
      「図5-49 Oracle WebLogic Server管理コンソール - 「javax.resource.cci.Connectionfactoryの設定」ページ」の説明

      Oracleファイル/FTPアダプタのコネクション・ファクトリの新しいパラメータは次のとおりです。

      controlDir - 制御ファイルを格納するディレクトリ構造に設定します。1つのクラスタ内で複数のWebLogic Serverインスタンスを実行する場合は、共有の場所に設定する必要があります。

      inboundDataSource - 値をjdbc/SOADataSourceに設定します。これは、高可用性に対応するスキーマが事前作成されるデータソースです。事前作成されたスキーマは、$BEA_HOME/AS11gR1SOA/rcu/integration/soainfra/sql/adapter/createschema_adapter_oracle.sqlで参照できます。それ以外の場所にスキーマを作成するには、このスクリプトを使用します。別のスキーマを選択した場合は、それに応じてinboundDataSourceプロパティを設定する必要があります。

      outboundDataSource - 値をjdbc/SOADataSourceに設定します。これは、高可用性に対応するスキーマが事前作成されるデータソースです。事前作成されたスキーマは、$BEA_HOME/AS11gR1SOA/rcu/integration/soainfra/sql/adapter/createschema_adapter_oracle.sqlで参照できます。それ以外の場所にスキーマを作成するには、このスクリプトを使用します。その場合は、outboundDataSourceプロパティを設定する必要があります。

      outboundLockTypeForWrite - Oracle Databaseを使用する場合は値をoracleに設定します。デフォルトでは、Oracleファイル/FTPアダプタはメモリー内mutexを使用してアウトバウンドの書込み操作をロックします。書込み操作を同期化するには、次の値のいずれかを選択する必要があります。

      memory - Oracleファイル/FTPアダプタは、インメモリーmutexを使用してファイル・システムへのアクセスを同期化します。

      oracle - アダプタはOracle Databaseの順序を使用します。

      db - アダプタは、事前作成されたデータベース表(FILEADAPTER_MUTEX)をロック・メカニズムとして使用します。このオプションは、Oracle Databaseスキーマ以外のスキーマを使用している場合にのみ使用します。

      user-defined - アダプタはユーザー定義mutexを使用します。ユーザー定義mutexを構成するには、mutexインタフェースoracle.tip.adapter.file.Mutexを実装し、名前がoracle.tip.adapter.file.mutexで、アウトバウンド参照のmutexの完全修飾クラス名の値を指定した新規バインディング・プロパティを構成する必要があります。

    8. 次の例に示すように、コネクション・ファクトリを使用するためにBPELプロセスまたはメディエータのシナリオを構成します。

      <adapter-config name="FlatStructureOut" adapter="File Adapter" xmlns="http://platform.integration.                        oracle/blocks/adapter/fw/metadata">
        <connection-factory                    location="eis/HAFileAdapter" adapterRef=""/>
        <endpoint-interaction portType="Write_ptt" operation="Write">
      <interaction-spec 
      className="oracle.tip.adapter.file.outbound                             .FileInteractionSpec">
            <property../>
            <property../>
          </interaction-spec>
        </endpoint-interaction>
      </adapter-config>

      ノート:

      接続ファクトリの位置属性は、eis/HAFileAdapterに設定されています。

      BPELおよびメディエータ・サービス・エンジンの両方のJCAヘッダー・プロパティを使用すると、このコネクション・ファクトリの位置を動的に変更できます。FTP JCAコネクション・ファクトリ・パラメータを動的に設定するには、場所(jndi)を削除するか、または無効な値(存在しないjndi)を指定します。これが発生するのは、管理対象ではないコネクション・ファクトリでは、location=<jndi>が指定されている場合、アウトバウンド・コネクションjndiに定義されたパラメータの方が優先度が高いからです。つまり、.jcaに指定された値は無効になります。

ノート:

データベースのネットワーク接続に失敗すると、HAFileAdapter「相互作用に対するmutexを取得できません。」およびリソースでロックを取得できませんという例外を検出します。ただし、これらの例外は機能には影響しません。

5.4.3 Oracle FTPアダプタでのセキュアFTPの使用

Oracle FTPアダプタでは、Windows、SolarisおよびLinuxでセキュアFTP機能を使用できます。この項では、セキュアFTP機能の概要と、この機能のインストールおよび構成方法を説明します。

この項には次のトピックが含まれます:

5.4.3.1 セキュアFTPの概要

機密データがリモート・サーバーへ転送される環境(クレジット・カード情報のHTTPサーバーへの送信など)では、セキュリティの問題は非常に重要です。このような場合、セキュリティには主に次の2つの要件があります。

  • データ交換をしているリモート・サーバーの信頼性

  • データの傍受を試みる第三者からの保護

Secure Socket Layer (SSL)の証明書と暗号化は、この2つのセキュリティ要件を満たすことに重点が置かれています。FTPでSSLが使用される場合、そのセキュリティ・メカニズムはFTPS(またはFTP over SSL)と呼ばれます。

SSL環境でクライアントの信頼を得るために、サーバーは認識済の認証局から証明書(X.509証明書など)を取得します。FTPサーバーを設定する際には、OpenSSLを使用してサーバーの証明書を作成します。どのクライアントも、初めは少数のパーティしか信頼しません。サーバーが信頼されているパーティの1つである場合、またはサーバーの証明書がそれらのパーティのいずれかで発行されたものである場合、間接的であるにしても信頼を得たことになります。たとえば、サーバーの証明書が、認証局Bから発行された証明書を持つ認証局Aから発行されたもので、クライアントがBを信頼していればそれで問題ありません。図5-50に示す設定では、サーバーの証明書は信頼できる証明書として、直接クライアントの証明書ストアにインポートされます。

送信前に暗号化し、受信後に復号することで、転送するデータは盗用されなくなります。データが大量な場合、(データの暗号化と復号に同じキーを使用する)対称型暗号化は公開キーと秘密キーを使用する方法よりもはるかに高速です。対称型暗号化はFTPSで使用される方法です。ただし、クライアントとサーバーがデータの暗号化や復号に同じキーを使用するには、共通のキーについて合意する必要があります。通常、クライアントが次のタスクを実行することで合意が成立します。

  • セッション・キーの生成(データの暗号化と復号に使用)

  • サーバーの証明書の一部であるサーバーの公開キーを使用したセッション・キーの暗号化

  • サーバーへのキーの送信

サーバーは秘密キーを使用してこのセッション・キーを復号化し、クライアントに送信する前にそのセッション・キーを使用してファイル・データを暗号化します。

5.4.3.2 SolarisおよびLinuxでのFTP Over SSLのインストールおよび構成

次の各項では、SolarisおよびLinux用のセキュアFTPのインストールおよび構成方法について説明します。

5.4.3.2.1 OpenSSLのインストールおよび構成

OpenSSLは、SSLプロトコルのオープン・ソースの実装です。OpenSSLは基本的な暗号機能を実装し、ユーティリティ関数を提供します。FTPサーバーとして使用するSolarisまたはLinuxのホストにOpenSSLをインストールして構成します。

  1. 次のURLへ移動します。
    http://www.openssl.org/source
    
  2. 使用可能なファイルのリストでopenssl-0.9.7g.tar.gzを検索します。たとえば:
     3132217 Apr 11 17:21:51 2005 
                    openssl-0.9.7g.tar.gz (MD5) (PGP sign)
    
  3. 次のファイルをダウンロードします。
    • openssl-0.9.7g.tar.gz

    • openssl-0.9.7g.tar.gz.md5 (MD5リンクの先)

    • openssl-0.9.7g.tar.gz.asc (PGP signリンクの先)

  4. gunzipを使用して次のファイルを解凍します。
    gunzip openssl-0.9.7g.tar.gz
    
  5. 次のtarファイルを解凍します。
    tar xvf openssl-0.9.7g.tar
    
  6. 次の場所にディレクトリを変更します。
    cd openssl-0.9.7g
    
  7. 次のコマンドを実行します。
    ./config --prefix=/usr --openssldir=/usr/local/openssl
    
  8. Bourneシェルに変更します(使用していない場合)。
    sh
    
  9. PATH変数を構成およびエクスポートします。
    PATH=${PATH}:/usr/ccs/bin; export PATH 
    
  10. 次のコマンドを実行します。
    make
    
  11. Bourneシェルを終了します。
    exit
    
  12. 次のコマンドを実行します。
    make test
    
  13. スーパーユーザーとしてログインします。
    msu
    
  14. 必要な場合にはパスワードを入力します。
  15. 次のコマンドを実行します。
    make install
    
5.4.3.2.2 vsftpdのインストールおよび構成

vsftpdサーバーは、UNIXシステム用のセキュアで高速なFTPサーバーです。FTPサーバーとして使用するSolarisまたはLinuxのホストにvsftpdをインストールして構成します。

  1. 次の場所に移動します。
    ftp://vsftpd.beasts.org/users/cevans/
    
  2. vsftpd-2.0.5をダウンロードします(tarファイルおよび署名ファイル(.ascファイル)が必要です)。たとえば:
    [BINARY]     vsftpd-2.0.5.tar.gz. . . . . . . . . . .    [Mar 19 21:26]    149K
    [FILE]       vsftpd-2.0.5.tar.gz.asc. . . . . . . . .    [Mar 19 21:26]    189B
    
  3. gunzipを使用して次のファイルを解凍します。
    gunzip vsftpd-2.0.5.tar.gz
    
  4. tarファイルを解凍します。
    tar xvf vsftpd-2.0.5.tar
    
  5. 次の場所にディレクトリを変更します。
    cd vsftpd-2.0.5
    
  6. builddefs.hファイルを次のように変更します。
    #undef VSF_BUILD_SSL
    

    変更後

    #define VSF_BUILD_SSL
    
  7. スーパーユーザーとしてログインします。
    msu
    
  8. 必要な場合にはパスワードを入力します。
  9. /etcディレクトリに、vsftpd.confという名前のファイルを次の設定で作成します。
    # Standalone mode
    listen=YES
    max_clients=200
    max_per_ip=4
    # Access rights
    anonymous_enable=YES
    #chroot_local_user=YES
    #userlist_enable=YES
    ftp_username=ftp
    local_enable=YES
    write_enable=YES
    anon_upload_enable=YES
    anon_mkdir_write_enable=YES
    anon_other_write_enable=YES
    chown_uploads=YES
    chown_username=ftp
    # Security
    anon_world_readable_only=NO
    allow_anon_ssl=YES
    ssl_enable=YES
    connect_from_port_20=YES
    hide_ids=YES
    pasv_min_port=50000
    pasv_max_port=60000
    # Features
    ftpd_banner="Welcome to the FTP Service"
    xferlog_enable=YES
    ls_recurse_enable=NO
    ascii_download_enable=NO
    async_abor_enable=YES
    # Performance
    one_process_model=NO
    idle_session_timeout=120
    data_connection_timeout=300
    accept_timeout=60
    connect_timeout=60
    anon_max_rate=50000
    

    ノート:

    vsftpd.confファイルのコピーが、vsftpd-2.0.5ディレクトリ構造のいくつかの場所に表示されます。それらのファイルの1つを使用して/etcディレクトリにvsftpd.confファイルを作成する場合は、ステップ9で説明されているパラメータと設定のみが含まれていることを確認してください。

  10. 次のコマンドを実行します。
    mkdir /var/ftp
    useradd -d /var/ftp ftp
    chown root /var/ftp
    chmod og-w /var/ftp 
    mkdir /usr/share/empty
    mkdir /usr/share/ssl 
    mkdir /usr/share/ssl/certs 
    
  11. 次のコマンドを実行します。
    openssl req -x509 -nodes -newkey rsa:1024 -keyout /usr/share/ssl/certs/vsftpd.pem -out /usr/share/ssl/certs/vsftpd.pem
    
  12. vsftpd-2.0.5ディレクトリからvsftpdデーモンを実行します。
    ./vsftpd
    
5.4.3.2.3 Oracle FTPアダプタの設定

次のタスクを実行してOracle FTPアダプタを設定します。

  1. SolarisまたはLinuxのホストで次のコマンドを実行します。
    mkdir /var/ftp/inDir 
    mkdir /var/ftp/outDir 
    chmod 777 /var/ftp/inDir /var/ftp/outDir
    
  2. Oracle WebLogic Server管理コンソールを使用して、Oracle FTPアダプタのデプロイメント・ディスクリプタでFTP接続パラメータを指定します。
    パラメータ 説明

    useFtps

    Trueに設定します。この設定は、FTP over SSLを使用する場合に必要です。デフォルト値はFalseです。

    channelMask

    SSL暗号化を使用するチャネル。可能な値は次のとおりです:

    • both (デフォルト): 制御チャネルとデータ・チャネルの両方が暗号化されます
    • control: 制御チャネルが暗号化されます。
    • data: データ・チャネルが暗号化されます

    FTPサーバーが許可している場合、転送されるファイルがすでに暗号化されている場合は、channelMaskcontrolに設定できます。

    securePort

    FTP over SSLのポート。デフォルトは990です。

    keystoreProviderName

    キーストア・プロバイダのクラス。デフォルトはoracle.security.pki.OraclePKIProviderです。

    keystoreType

    キーストア・タイプ。デフォルトはPKCS12です。

    keystoreAlgorithm

    キーストア・アルゴリズム。デフォルトはOracleX509です。

    enableCipherSuits

    カンマ区切りの暗号スイートのリスト。デフォルトは空白で、暗号スイートのデフォルト・リストが使用されます。ほとんどの場合、デフォルトを変更する必要はありません。

    pkiProvider

    PKIプロバイダの名前。デフォルトはOraclePKIです。

    jsseProvider

    JSSEプロバイダの名前。デフォルトはOracleJSSEです。

    ノート:

    これでセキュアFTPのインストールおよび構成が完了し、Oracle FTPアダプタでこの機能を使用する準備ができました。

5.4.3.3 WindowsでのFTP Over SSLのインストールおよび構成

FTPS機能はOpenSSLを使用したFileZilla FTPサーバーで動作確認されています。WindowsでFileZillaを使用する場合にOpenSSLをインストールおよび構成するには、次の各項の手順に従う必要があります。

5.4.3.3.1 OpenSSLのインストール

OpenSSLは、SSLプロトコルのオープン・ソースの実装です。OpenSSLは基本的な暗号機能を実装し、ユーティリティ関数を提供します。FTPサーバーとして使用するWindowsのホストにOpenSSLをインストールして構成するには、次のステップを実行します。

  1. 次のURLへ移動します。
  2. Visual C++ 2008 Redistributablesをダウンロードしてインストールします。
  3. Win32 OpenSSL v0.9.8k Lightをダウンロードしてインストールします。
5.4.3.3.2 OpenSSLのサーバー・キーおよびサーバー証明書の生成

(FileZillaの「Generate new certificate」をクリックすることで、FileZillaユーティリティを使用して秘密キーおよび証明書を生成し、この項のステップをスキップできます。入力する「共通名」が、FileZilla FTPサーバーが実行中のマシンの完全修飾ホスト名またはIPであることを確認します。サーバー・キーのPEMからPKCS12フォーマットへの変換のステップは、引き続き実行する必要があります。ただし、FileZilla生成の秘密キーおよび証明書ファイルを使用します。)

サーバー・キー・ファイルおよび証明書ファイルを作成するには、次のステップを実行します:

  1. コマンド・プロンプトを開いてOpenSSL\binディレクトリを参照します。
  2. 次のコマンドを実行します。
    openssl req -new -x509 -keyout mykey.pem -out mycert.pem -days 365
    

    サンプルのコマンド出力は次のとおりです。

    C:\OpenSSL\bin>openssl req -new -x509 -keyout mykey.pem       -out mycert.pem -days 365
    Loading 'screen' into random state - done
    Generating a 1024 bit RSA private key
    ..........++++++
    .......++++++
    writing new private key to 'mykey.pem'
    Enter PEM pass phrase:
    Verifying - Enter PEM pass phrase:
    -----
    You are about to be asked to enter information that
           will be incorporated into your certificate request.
    What you are about to enter is what is called a
                          Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [AU]:US
    State or Province Name (full name) [Some-State]:CA
    Locality Name (eg, city) []:Belmont
    Organization Name (eg, company) 
                    [Internet Widgits Pty Ltd]:Test
    Organizational Unit Name (eg, section) []:Test
    Common Name (eg, YOUR name) []:Test test
    Email Address []:test@test.com
    
  3. 必要な場合にはPEMパスフレーズを入力します。
  4. 検証のためにステップ3で入力したPEMパスフレーズを再入力します。
  5. 要求された詳細を入力します。

    サーバー・キー(mykey.pem)およびサーバー証明書(mycert.pem)がOpenSSL\binディレクトリに生成されます。

5.4.3.3.3 サーバー・キーおよびサーバー証明書のFileZillaサーバーへのインポート

サーバー・キーおよびサーバー証明書をFileZillaにインポートするには、次のステップを実行します。

  1. Windowsの「スタート」メニューから、FileZillaサーバーを開きます。
  2. 「Edit」を選択して「Settings」をクリックします。

    「FileZilla Server Options」ダイアログが表示されます。

  3. 「SSL/TLS settings」をクリックします。
  4. 図5-51に示すように、サーバー・キーおよびサーバー証明書の詳細を入力します。

    図5-51 「FileZilla Server Options」ダイアログ

    図5-51の説明が続きます
    「図5-51 「FileZilla Server Options」ダイアログ」の説明

    ノート:

    「Key password」フィールドでは、「OpenSSLのサーバー・キーおよびサーバー証明書の作成」のステップ3で生成したPEMパスフレーズを使用する必要があります。

5.4.3.3.4 サーバー・キーのPEMからPKCS12フォーマットへの変換

Oracle FTPアダプタではPEMフォーマットが認識されないため、サーバー・キーおよびサーバー証明書をPEMフォーマットからPKCS#12フォーマットへ変換する必要があります。

サーバー・キーおよびサーバー証明書をPKCS#12フォーマットに変換するには

  1. コマンド・プロンプトを開いてOpenSSL\binディレクトリを参照します。
  2. 次のコマンドを実行します。
    openssl pkcs12 -export -out mykeyz.p12 -in mycert.pem -inkey mykey.pem
    

    コマンド出力は次のとおりです。

    openssl pkcs12 -export -out mykeyz.p12 -in mycert.pem -inkey mykey.pem
    Loading 'screen' into random state - done
    Enter pass phrase for mykey.pem:
    Enter Export Password:
    Verifying - Enter Export Password:
    
  3. 必要な場合にはPEMパスフレーズを入力します。このパスフレーズは、「OpenSSLのサーバー・キーおよびサーバー証明書の生成」でOpenSSLのサーバー・キーおよびサーバー証明書を生成中に作成したパスフレーズです。
  4. PKCS#12ファイルに対するエクスポート・パスワードを入力します。
  5. 検証のためにエクスポート・パスワードを再入力します。
  6. 要求された詳細を入力します。

    mykeyz.p12ファイルがOpenSSL\binディレクトリに生成されます。

  7. mykeyz.p12ファイルをOracle FTPアダプタを実行中の管理対象のOracle WebLogic Serverインスタンスにコピーします。

    たとえば:

    /scratch/$user/private/mykeyz.p12 
    
5.4.3.3.5 新しいキーを使用するためのOracle FTPアダプタのデプロイメント・ディスクリプタの構成

Oracle FTPアダプタのデプロイメント・ディスクリプタを構成するには、次のステップを実行します。

  1. http://servername:portnumber/consoleにナビゲートします。
  2. 必要な資格証明を使用して、Oracle WebLogic Server管理コンソールのホーム・ページを開きます。
  3. 「ドメイン構造」ペインで「デプロイメント」を選択します。

    Oracle WebLogic Server管理コンソールの「デプロイメントのサマリー」ページが表示されます。

  4. 「FtpAdapter」をクリックします。

    Oracle WebLogic Server管理コンソールの「FtpAdapterの設定」ページが表示されます。

  5. 「構成」タブをクリックし、「アウトバウンド接続プール」タブをクリックします。

    「アウトバウンド接続プールの構成表」が表示されます。

  6. 構成するFTPアダプタ・インスタンスのJNDI名を選択します。たとえば、"eis/Ftp/FtpAdapter"
  7. 表5-11に示すデプロイメント・ディスクリプタを構成します。

    表5-11 Oracleファイル/FTPアダプタのJCAプロパティ

    プロパティ名 プロパティ値

    useFtps

    この値にはtrueを設定します。

    walletLocation

    管理対象のOracle WebLogic Server ServerインスタンスのPKCS#12ファイルの場所(/scratch/$user/private/mykeyz.p12)を設定します。

    walletPassword

    この値には、「サーバー・キーのPEMからPKCS12フォーマットへの変換」のステップ4で生成したエクスポート・パスワードを設定します。

    keyStoreProviderName

    この値には、sun.security.provider.Sunを設定します。

    keystoreType

    この値には、PKCS12を設定します。

    keystoreAlgorithm

    この値には、SunX509を設定します。

    pkiProvider

    空白のままにしておく必要があります。

    jsseProvider

    空白のままにしておく必要があります。

5.4.4 Oracle FTPアダプタでのSFTPの使用

SSHファイル転送プロトコル(SFTP)は、ネットワークを介したセキュアなファイル転送を可能にするネットワーク・プロトコルです。Oracle FTPアダプタでは、WindowsおよびLinuxでSFTP機能を使用できます。この項では、SFTP機能の概要と、この機能のインストールおよび構成方法を説明します。

この項では、次のタスクを取り上げます。

5.4.4.1 SFTPの概要

FTPは、クライアントが基礎となるSSHトランスポートを介してファイルを安全に転送できるようにするネットワーク・プロトコルです。SFTPはFTP over SSHともファイル転送プロトコル(FTP)とも異なります。図5-52に、SSHクライアントとSSHサーバーの間の通信プロセスを示します。SFTPはWindowsとLinuxでサポートされています。

SFTPの機能は、次のとおりです。

5.4.4.1.1 暗号化

SSHプロトコルでは、暗号化に公開キー暗号を使用します。ここでは、データがどのように暗号化されるかについて説明します。

  1. SSHサブシステムにより、Data Encryption Standard (DES)やBlowfishなどの対称キー暗号を使用してセッション・キーが生成されます。現在、SSHプロトコルではDiffie-Hellmanキー交換アルゴリズムを使用してセッションの対称キーが導出されています。
  2. セッション・キーを使用してデータが暗号化されます。
  3. 受信者の公開キーを使用してセッション・キーが暗号化されます。受信者は秘密キーを持っているため、Rivest-Shamir-Adleman (RSA)やDigital Signature Algorithm (DSA)など、必要なPKIアルゴリズムを使用してメッセージを復号化できます。
5.4.4.1.2 認証

本来、SSHプロトコルでは、パスワードまたはセッション・キーをネットワークでの転送時に暗号化することでパスワード認証をサポートしています。また、SSHプロトコルでは「既知のホスト」というメカニズムを使用して、IPスプーフィングなどの脅威を防止します。クライアントとサーバーの両方でこのメカニズムが使用されている場合、あらゆる種類の通信を行う前に相互にアイデンティティを証明する必要があります。

5.4.4.1.3 整合性

SSHプロトコルは、Message Digest Algorithm 5 (MD5)やSecure Hash Algorithm (SHA-1)など、広範囲に信頼されているバルク・ハッシュ・アルゴリズムを使用することで、挿入攻撃を防止します。「暗号化」で説明したアルゴリズムを使用してデータ整合性チェックサムを実装することで、送信中のデータが故意に改ざんされるのを防止できます。

5.4.4.1.4 データ圧縮

SSHプロトコルは、オープン・ソースのプラットフォーム間データ圧縮アルゴリズムであるzlibをサポートしています。SSHでは、ネットワーク帯域幅を低減するためにzlibを使用して通信中のデータが圧縮されます。

5.4.4.2 OpenSSH for Windowsのインストールと構成

OpenSSH for Windowsは、WindowsでのSSHプロトコルの無償実装です。Windows XPでOpenSSHをインストールおよび構成するには、次のステップを実行します。

  1. Administrator権限を持つユーザーとしてログインします。

  2. 次のサイトからsetup.exeをダウンロードします。

    http://www.cygwin.com
    
  3. setup.exeを実行します。「Cygwin Net Release Setup」ウィンドウが表示されます。

  4. 「次へ」をクリックします。「Choose Installation type」ウィンドウが表示されます。

  5. ダウンロード・ソースとして「Install from Internet」を選択し、「Next」をクリックします。「Choose Installation Directory」ウィンドウが表示されます。

  6. 「root directory」はC:\cygwinのままにしておきます。「Install For」および「Default Text File Type」フィールドも、デフォルト・オプションのままにしておきます。

  7. 「次へ」をクリックします。「Select Local Package Directory」ウィンドウが表示されます。

  8. 「Browse」をクリックし、ローカル・パッケージ・ディレクトリとして「C:\cygwin」を選択します。

  9. 「次へ」をクリックします。「Select Connection Type」ウィンドウが表示されます。

  10. インターネット接続の設定を選択して「Next」をクリックします。「Choose Download Site(s)」ウィンドウが表示されます。

  11. 「Available Download Sites」リストからサイトを選択し、「Next」をクリックします。「Select Packages」ウィンドウが表示されます。

  12. 「View」をクリックして、インストール可能な全パッケージのリストを表示します。

  13. デフォルト値でない場合は「openssh」を選択します。

  14. opensshの「Binaries」ボックスを選択します。

  15. 「Next」をクリックしてインストールを開始します。

  16. Windows XPデスクトップで、「マイ コンピュータ」を右クリックして「プロパティ」を選択します。

  17. 「詳細設定」タブをクリックし、「環境変数」をクリックします。

  18. 「新規」をクリックし、「変数名」フィールドにCYGWIN「変数値」フィールドにntsecと入力します。

  19. システム・パスにC:\cygwin\binを追加します。

  20. 「cygwin」ウィンドウを開きます。

  21. ssh-host-configと入力します。

  22. 次のプロンプトが表示されます。

    1. Shall privilege separation be used? (yes/no)

      yesと入力します。

    2. Shall this script create a local user 'sshd' on this machine?

      yesと入力します。

    3. Do you want to install sshd as service?

      (Say "no" if it's already installed as service)(yes/no)

      yesと入力します。

    4. Which value should the environmentvariable CYGWIN have when sshdstarts? It's recommended to setat least "ntsec" to be able to change user context without password. Default is "binmode ntsec tty".

      ntsecと入力します。

  23. net start sshdと入力してsshdサービスを開始します。

  24. 「cygwin」ウィンドウで次のコマンドを実行して、Windowsのローカル・ユーザー・アカウントをcygwinにレプリケートします。

    mkpasswd --local > /etc/passwd
    mkgroup --local > /etc/group
    
  25. 設定をテストするために、「cygwin」ウィンドウにssh localhostと入力します。

5.4.4.3 Oracle FTPアダプタでのSFTPの設定

SFTP機能を使用するには、Oracle FTPアダプタのデプロイメント・ディスクリプタを変更する必要があります。

表5-12に、デプロイメント・ディスクリプタで値を指定する必要があるプロパティを示します。これらのプロパティの値は、認証のタイプとOpenSSHの場所に応じて異なります。

表5-12 SFTPのプロパティ

プロパティ 説明

useSftp

trueを指定します。

必須: はい

デフォルト値: false

authenticationType

パスワードベース認証の場合はPASSWORD、公開キー認証の場合はPUBLICKEYを指定します。

パスワードベース認証の場合は、weblogic-ra.xmlファイルに指定されているユーザー名とパスワードが使用されます。weblogic-ra.xmlファイルに指定されているのと同じ名前とパスワードを持つWindowsユーザーが存在することを確認してください。また、ユーザーには管理権限が必要です。

公開キー認証の場合は、privateKeyFileパラメータを秘密キー・ファイルの場所に設定する必要があります。

必須: はい

preferredKey ExchangeAlgorithm

diffie-hellman-group1-sha1またはdiffie-hellman-group-exchange-sha1を指定します。

これはオプション・パラメータであり、ユーザーはメッセージ暗号化に使用するセッション・キーを交換する際にデフォルトのキー交換プロトコルを選択できます。

必須: いいえ

デフォルト値: diffie-hellman-group1-sha1

preferred CompressionAlgorithm

noneまたはzlibを指定します。

このパラメータにより、通信中のデータを圧縮するかどうかを選択できます。

必須: いいえ

preferred DataIntegrityAlgorithm

hmac-md5またはhmac-sha1を指定します。

このパラメータにより、データ整合性チェックに使用するバルク・ハッシュ・アルゴリズムを選択できます。

必須: いいえ

デフォルト値: hmac-md5

preferredPKIAlgorithm

ssh-rsaまたはssh-dsaを指定します。

このパラメータにより、通信に使用する非対称型暗号を構成できます。

必須: いいえ

デフォルト値: ssh-rsa

privateKeyFile

秘密キー・ファイルへのパスを指定します。authenticationTypeパラメータをPUBLICKEYに設定した場合は、このパラメータが必須です。

必須: いいえ

preferredCipherSuite

次のリストから暗号を1つ指定します。

  • twofish192-cbc

  • cast128-cbc

  • twofish256-cbc

  • aes128-cbc

  • twofish128-cbc

  • 3des-cbc

  • blowfish-cbc

  • aes256-cbc

  • aes192-cbc

必須: いいえ

デフォルト値: blowfish-cbc

transportProvider

socketまたはHTTPを指定します。

SSHサーバーがファイアウォールの内側にある場合はsocketを指定します。SSHサーバーがファイアウォールの外側にある場合、またはサーバーがHTTPサーバーを介して公開される場合は、HTTPを指定します。

HTTPを選択した場合は、次のパラメータの値を指定する必要があります。

  • proxyHost

  • proxyPort

  • useProxy

必須: はい

5.4.4.3.1 パスワード認証を使用するためのOracle FTPアダプタの構成

Oracle FTPアダプタでパスワード認証を使用するように設定するには、表5-12に示したプロパティの値をOracle FTPアダプタのデプロイメント・ディスクリプタで指定する必要があります。authenticationTypeプロパティがpasswordに設定されていることを確認してください。

表5-13のプロパティと値を指定します。

表5-13 サンプルのSFTPのプロパティとその値

プロパティ

useSftp

true

authenticationType

PASSWORD

preferredKey ExchangeAlgorithm

diffie-hellman-group1-sha1

preferred CompressionAlgorithm

none

preferred DataIntegrityAlgorithm

hmac-md5

preferredPKIAlgorithm

ssh-rsa

privateKeyFile

-

preferredCipherSuite

blowfish-cbc

transportProvider

socket

5.4.4.3.2 公開キー認証を使用するためのOracle FTPアダプタの構成

公開キー認証の場合は、最初にOpenSSHを構成してからOracle FTPアダプタを設定する必要があります。

Oracle FTPアダプタの設定は、OpenSSHがファイアウォールの内側で実行されるかどうかに応じて異なります。

OpenSSHがファイアウォールの内側で実行される場合は、次の項を参照してください。

OpenSSHがファイアウォールの外側で実行される場合は、次の項を参照してください。

5.4.4.3.3 公開キー認証を使用するためのOpenSSHの構成

次のステップを実行します。

  1. C:\cygwin\etcディレクトリに移動します。必要な場合は、公開キー認証を強制するようにsshd_configファイルを構成します。詳細は、opensshのヘルプまたはマニュアルを参照してください。
  2. C:\cygwin\binディレクトリに移動します。
  3. 次のコマンドを実行してキーのペアを生成します。
    ssh-keygen -t rsa
    
  4. キーの保存先ファイルを求めるプロンプトに対して/etc/id_rsaと入力します。
  5. パスフレーズを入力します。
  6. パスフレーズを再入力します。
  7. /etcディレクトリに移動し、公開キー・ファイル(id_rsa.pub)と秘密キー・ファイル(id_rsa)の両方が生成されたことを確認します。
  8. 次のコマンドを実行して公開キー・ファイルのコピーを作成します。
    cp id_rsa.pub authorized_keys
    
  9. 秘密キー・ファイルのコピーを安全な場所(C:\my-secured-folder\など)に作成します。Oracle FTPアダプタ構成では、この秘密キー・ファイルが参照されます。
  10. 次のコマンドを実行してOpenSSHサーバーを再起動します。
    net stop sshd
    net start sshd
    
5.4.4.3.4 OpenSSHがファイアウォールの内側で実行されている場合に公開キー認証を使用するためのOracle FTPアダプタの構成

Oracle FTPアダプタで公開キー認証を使用するように設定するには、表5-12に示したパラメータの値をデプロイメント・ディスクリプタで指定する必要があります。authenticationTypeパラメータがpublickeyに、transportProviderパラメータがsocketに設定されていることを確認します。privateKeyFileパラメータには、秘密キー・ファイルの場所が含まれている必要があります。

表5-14に、公開キー認証プロパティとその値のサンプル・リストを示します。

表5-14 サンプルのSFTPのプロパティとその値

プロパティ

useSftp

true

authenticationType

publickey

preferredKey ExchangeAlgorithm

diffie-hellman-group1-sha1

preferred CompressionAlgorithm

none

preferred DataIntegrityAlgorithm

hmac-md5

preferredPKIAlgorithm

ssh-rsa

privateKeyFile

C:\my-secured-folder\id_rsa

preferredCipherSuite

blowfish-cbc

transportProvider

socket

ノート:

privateKeyFileプロパティで構成された秘密キー・ファイルがパスフレーズで保護されている場合、 Passwordプロパティを使用してパスフレーズを入力します。 PassPhraseプロパティは、MultilevelAuthenticationプロパティのパスワードを構成するために使用されます。
5.4.4.3.5 OpenSSHがファイアウォールの外側で実行されている場合に公開キー認証を使用するためのOracle FTPアダプタの構成

OpenSSHがファイアウォールの外側で実行されている場合にOracle FTPアダプタを公開キー認証用に設定するには、次のステップを実行します。

  1. 表5-12に示したプロパティの値をOracle FTPアダプタのデプロイメント・ディスクリプタで指定する必要があります。authenticationTypeプロパティがpublickeyに、transportProviderプロパティがHTTPに設定されていることを確認します。privateKeyFileプロパティでは、秘密キー・ファイルの場所が指定されています。
  2. Oracle FTPアダプタのデプロイメント・ディスクリプタで、次のプロキシ関連プロパティも指定します。
    • proxyHost: プロキシ・ホスト名

    • proxyPort: プロキシのポート番号

    • proxyUsername: プロキシのユーザー名

    • proxyPassword: プロキシのパスワード

    • useProxy: プロキシを使用する場合はtrue

表5-15に、公開キー認証プロパティおよびプロキシ・プロパティのサンプル・リストを示します。

表5-15 サンプルのSFTPのプロパティとその値

プロパティ

proxyHost

proxy.host.com

proxyPort

80

proxyUsername

anonymous

proxyPassword

tiger@scott.com

useProxy

true

useSftp

true

authenticationType

publickey

preferredKey ExchangeAlgorithm

diffie-hellman-group1-sha1

preferred CompressionAlgorithm

none

preferred DataIntegrityAlgorithm

hmac-md5

preferredPKIAlgorithm

ssh-rsa

privateKeyFile

C:\my-secured-folder\id_rsa

preferredCipherSuite

blowfish-cbc

transportProvider

HTTP

ノート:

privateKeyFileプロパティで構成された秘密キー・ファイルがパスフレーズで保護されている場合、 Passwordプロパティを使用してパスフレーズを入力します。 PassPhraseプロパティは、MultilevelAuthenticationプロパティのパスワードを構成するために使用されます。
5.4.4.3.6 WINSSHDサーバーの構成

WINSSHDサーバーで機能するSFTPアダプタの場合、接続ファクトリでtrueとしてIgnorePermissionsOnFileプロパティを構成します。

IgnorePermissionsOnFileプロパティを構成するには:

  1. WebLogic Servicerコンソールにログインします。
  2. 「デプロイメント」「FTPアダプタ」「構成」「アウトバウンド接続プール」に移動します。
  3. javax.resource.cci.ConnectionFactoryを展開します。
  4. 対応するJNDIをクリックします。
  5. ignorePermissionsOnFileを検索します。
  6. 値をtrueに変更します。
FTPアダプタを再デプロイして、新しい構成をロードします。

5.4.5 OracleファイルとFTPアダプタのFIPS準拠の有効化

SFTP用の接続ファクトリの構成中にFIPS準拠を有効化できます。

FTPアダプタは、暗号化を使用してセキュリティ機能を実装するか、セキュリティ・ポリシーを施行する場合は常にFIPS-140の検証された暗号化の使用をサポートします。たとえば、暗号化、復号化、署名、ハッシュ、検証などです。

FIPS準拠を選択する場合、システムはMaverickクライアントのFIPSモードを有効化し、構成された優先キー交換アルゴリズムおよび公開キー・アルゴリズムを使用してSFTPサーバーに接続します。SFTPClientを更新して、これらの変更に対応します。

EnableFIPSMode接続ファクトリ・プロパティを有効化すると、アダプタはMaverickでenableFIPS()を使用します。EnableFIPSModeを有効化するには、次の例に示すように、値をtrueに変更します:

<wls:property>
	<wls:name>EnableFIPSModewls:name>EnableFIPSMode>
	<wls:value>truewls:value>true>
</wls:property>

eis/Ftp/SftpAdapter_FIPSにあるSftpAdapter_FIPS接続ファクトリで、プロパティはすでにtrueに設定されています。

1.4.44バージョンからJ2SSH Maverickライブラリを使用している場合、1.4.47にアップグレードします(FIPS準拠はこのバージョンでのみサポートされているため)。
  • J2SSH Maverickライブラリは、$MW_HOME/soa/soa/modules/maverick-all.jarで更新されます

  • Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Filesは、jre/lib/securityに配置されています

FTPアダプタはJDKに依存し、現在のSun JDKは2048ビット暗号をサポートしていません。動作保証には、KeyStoreプロバイダとしてRsaJsseを使用します。また、プロバイダとしてcom.rsa.jsse.JsseProviderをセキュリティ・ポリシー・ファイルに追加します。
接続ファクトリの次のパラメータを設定します:
  • KeyStoreProviderName = com.rsa.jsse.JsseProvider

  • KeyStoreType = PKCS12

  • KeystoreAlgorithm = X509

  • PkiProvider = 空白のまま

  • JsseProvider = RsaJsse

  • TrustManager = oracle.tip.adapter.ftp.ServerTrustManager

  • EnableFIPSMode = true

FIPSモードを有効化する場合、FIPS準拠の暗号リストから優先暗号を選択します。

表5-16 FIPSモードが有効化されたおよび無効化された優先キー交換アルゴリズムおよび公開キー・アルゴリズム

機能 無効化されるFIPSモード 有効化されるFIPSモード

キーの交換

diffie-hellman-group14-sha1

diffie-hellman-group14-sha1 (デフォルト)

キーの交換

diffie-hellman-group1-sha1(デフォルト)

diffie-hellman-group14-sha1 (デフォルト)

キーの交換

diffie-hellman-group-exchange-sha1

diffie-hellman-group14-sha1 (デフォルト)

キーの交換

diffie-hellman-group-exchange-sha256

diffie-hellman-group14-sha1 (デフォルト)

公開キー・アルゴリズム

ssh-rsa (デフォルト)

ssh-rsa (デフォルト)

公開キー・アルゴリズム

ssh-dss

ssh-rsa (デフォルト)

公開キー・アルゴリズム

x509v3-sign-rsa

ssh-rsa (デフォルト)

公開キー・アルゴリズム

x509v3-sign-dss

ssh-rsa (デフォルト)

公開キー・アルゴリズム

x509v3-sign-rsa-sha1

ssh-rsa (デフォルト)

詳細は、『Oracle Fusion Middlewareの管理』Oracle Fusion MiddlewareでのFIPS 140サポートに関する項を参照してください。

5.4.6 HTTPプロキシ用のOracle FTPアダプタの構成

Oracle FTPアダプタがサポートしているプロキシはHTTPプロキシのみです。HTTPプロキシ・サポートは、プレーンFTPモードおよびSFTPモードという2つのモードで使用できます。この項では、プレーンFTPモードとSFTPモードで実行するようにOracle FTPアダプタを構成する方法について説明します。次の項目が含まれます。

5.4.6.1 プレーンFTPモード用の構成

Oracle FTPアダプタをプレーンFTPモードで実行する場合は、Oracle FTPアダプタのデプロイメント・ディスクリプタで特定のパラメータの値を指定する必要があります。表5-17に変更が必要なプロパティを示します。

表5-17 プレーンFTPモードのプロパティ

プロパティ 説明

host

リモートFTPサーバー名。

port

FTP制御ポート番号。

username

FTPユーザー名。

password

FTPパスワード。

proxyHost

プロキシ・ホスト名。

proxyPort

プロキシ・ポート番号。

proxyUsername

プロキシ・ユーザー名。

proxyPassword

プロキシ・パスワード。

proxyType

プロキシ・タイプ。サポートされるのはHTTPプロキシ・タイプのみです。

proxyDefinitionFile

プロキシ定義ファイルの絶対パス。

このパラメータはオプションです。

詳細は、「プロキシ定義ファイル」を参照してください。

useProxy

プロキシを使用する場合はtrueを指定します。

表5-18に、Oracle FTPアダプタのディスクリプタのプロパティとその値のサンプル・リストを示します。

表5-18 サンプルのプレーンFTPモードのプロパティとその値

プロパティ

host

my.host.com

port

21

username

user

password

password

proxyHost

proxy.host.com

proxyPort

80

proxyUsername

anonymous

proxyPassword

tiger@scott.com

proxyType

http

proxyDefinitionFile

c:\proxydefinitions.xml

useProxy

true

5.4.6.1.1 プロキシ定義ファイル

すべてのプロキシ固有情報をプロキシ定義ファイルで指定し、このファイルを使用するようにOracle FTPアダプタのデプロイメント・ディスクリプタ・ファイルのproxyDefinitionFileプロパティでアダプタを構成できます。プロキシ定義ファイルはXMLフォーマットで記述され、XMLスキーマに基づきます。次の例に、プロキシ定義ファイルのXMLスキーマを示します。プロキシ定義ファイルは、このXMLスキーマに基づく必要があります。

例 - プロキシ定義ファイルのXMLスキーマ

<?xml version = \"1.0\" encoding = \"UTF-8\"?>
<schema targetNamespace = "http://ns.oracle.com/ip
                  /af/ftp/proxy" xmlns = 
"http://www.w3.org/2001/XMLSchema" 
xmlns:proxy="http://ns.oracle.com/ip/af/ftp/proxy">

         <element name="ProxyDefinitions" type="proxy:
                      ProxyDefinitionsType"/>
              <complexType name="ProxyDefinitionsType">
                      <sequence>
                           <element name="Proxy" 
                                  type="proxy:ProxyDefinition"
                            minOccurs="0" 
                                maxOccurs="unbounded"/>
                      </sequence>
              </complexType>

              <complexType name="ProxyDefinition">
                      <sequence>
                           <element name="Step" 
                                       type="proxy:StepType"
                            minOccurs="1" 
                                maxOccurs="unbounded"/>
                      </sequence>
                      <attribute name="key" type="ID"
                                        use="required"/>
                      <attribute name="description"
                                        type="string"
                       use="required"/>
                      <attribute name="type" 
                           type="proxy:Protocol"
                       use="optional"/>
              </complexType>

              <complexType name="StepType">
                  <simpleContent>
                     <extension base="string">
                         <attribute name="command"
                                 type="string" 
                                     use="required"/>
                         <attribute name="args" type="string" 
                                     use="required"/>
                     </extension>
                  </simpleContent>
              </complexType>

               <simpleType name="Protocol">
                    <restriction base="string">
                          <enumeration value="ftp" />
                          <enumeration value="http" />
                    </restriction>
               </simpleType>
</schema>

「例 - プロキシ定義ファイルのXMLスキーマ」に基づくサンプルのプロキシ定義ファイルは、次の例のようになります。

例 - プロキシ定義ファイル

<?xml version = '1.0' standalone = 'yes'?> 
<proxy:ProxyDefinitions xmlns:proxy=
              "http://ns.oracle.com/ip/af/ftp/proxy"> 
<Proxy key="http" description="http" type="http"> 
<Step command="USER" args="remote_username" /> 
<Step command="PASS" args="remote_password" /> 
</Proxy>
</proxy:ProxyDefinitions>

「例 - プロキシ定義ファイル」のファイルを使用すると、Oracle FTPアダプタから次の一連のログイン・コマンドが送信されます。

  1. USER remote_username

  2. PASS remote_password

プロキシ定義ファイルで、Oracle FTPアダプタのデプロイメント・ディスクリプタの値を取得するように指定することもできます。その場合は次の式を使用できます。

  • $proxy.user: Oracle FTPアダプタのデプロイメント・ディスクリプタのproxyUsernameパラメータの値に対応します。

  • $proxy.pass: Oracle FTPアダプタのデプロイメント・ディスクリプタのproxyPasswordパラメータの値に対応します。

  • $remote.user: Oracle FTPアダプタのデプロイメント・ディスクリプタのusernameパラメータの値に対応します。

  • $remote.pass: Oracle FTPアダプタのデプロイメント・ディスクリプタのpasswordパラメータの値に対応します。

  • $remote.host: Oracle FTPアダプタのデプロイメント・ディスクリプタのhostパラメータの値に対応します。

  • $remote.port: Oracle FTPアダプタのデプロイメント・ディスクリプタのportパラメータの値に対応します。

次の例に、「例 - プロキシ定義ファイル」のXMLスキーマに基づき、weblogic-ra.xmlファイルから値を取得するサンプルのプロキシ定義ファイルを示します。

例 - デプロイメント・ディスクリプタから値を取得するプロキシ定義ファイル

<?xml version = '1.0' standalone = 'yes'?> 
<proxy:ProxyDefinitions xmlns:proxy=
            "http://ns.oracle.com/ip/af/ftp/proxy"> 
<Proxy key="http" description="http" type="http"> 
<Step command="USER" args="$remote.user" /> 
<Step command="PASS" args="$remote.pass" /> 
</Proxy>
</proxy:ProxyDefinitions>
5.4.6.2 SFTPモード用の構成

Oracle FTPアダプタをSFTPモードで実行する場合は、Oracle FTPアダプタのデプロイメント・ディスクリプタで特定のプロパティの値を指定する必要があります。表5-19に変更が必要なプロパティを示します。

表5-19 SFTPモードのプロパティ

プロパティ 説明

host

リモートFTPサーバー名。

port

FTP制御ポート番号。

username

SFTPユーザー名。

password

SFTPパスワード。

proxyHost

プロキシ・サーバーのホスト名。

proxyPort

プロキシ・ポート番号。

proxyUsername

プロキシ・ユーザー名。

proxyPassword

プロキシ・パスワード。

useSftp

SFTPモードの場合はtrueを指定します。SFTP機能を使用するには、この値が必須です。

authenticationType

PASSWORDまたはPUBLICKEYを指定します

「SFTP用の設定」を参照してください

transportProvider

httpを指定します。サポートされるのはHTTPトランスポート・プロバイダのみです。

表5-20に、デプロイメント・ディスクリプタのプロパティのサンプル・リストを示します。

表5-20 サンプルのSFTPモードのプロパティとその値

プロパティ

host

my.host.com

port

22

username

user

password

password

proxyHost

proxy.host.com

proxyPort

80

proxyUsername

anonymous

proxyPassword

password

useSFTP

true

authenticationType

password

transportProvider

http or socket

5.4.7 高可用性のためのファイル/FTPアダプタの構成

SOAとOSBの両方で、アクティブ/アクティブ・トポロジ内に高可用性のためのファイル/FTPアダプタを構成できます。高可用性は、インバウンドとアウトバウンドの両方の操作に対して構成できます。

5.4.7.1 インバウンド操作

Oracleファイル/FTPアダプタでは、分散トポロジ内で1つのノードのみが特定のファイルを処理することが保証されます。HAを有効にするために、ファイル/FTPアダプタはデータベース表またはCoherenceキャッシュをコーディネータとして使用して、Oracleファイル/FTPアダプタのインバウンド操作に対する高可用性を保証しています。

データベース表を使用して高可用性を有効にするには、.jcaファイル内にeis/HAFIleAdapterを指定する必要があります。これは高可用性のためにOracle表を使用することを指定するものであり、SQL Server表の場合はeis/HAFileAdapterMQSSQL、DB2表の場合はeis/HAFileAdapterDB2をそれぞれ指定します。

ファイル/FTPアダプタでは、HA機能のためにデータベース・ベースのコーディネータだけでなくCoherenceもサポートされています。このためには、ファイル・アダプタの場合はeis/CoherenceHAFileAdapter、FTPアダプタの場合はeis/Ftp/CoherenceHAFtpAdapterを指定できます。

次に示すファイル・アダプタ用の.jcaファイルでは、コネクション・ファクトリがCoherenceHAFileAdapterとして指定されています。

例 - コネクション・ファクトリとしてCoherenceHAFileAdapterが指定されたファイル・アダプタ用の.jcaファイル

<adapter-config name="FileHACoherenceIn" 
                   adapter="File Adapter"
    wsdlLocation="FileHACoherenceIn.wsdl" 
    xmlns="http://platform.integration.
           oracle/blocks/adapter/fw/metadata">
  <connection-factory location=
                  "eis/CoherenceHAFileAdapter"
   UIincludeWildcard="*.zip" adapterRef=""/>
  <endpoint-activation portType="Read_ptt"
                   operation="Read">
    <activation-spec className=
                     "oracle.tip.adapter.file.
                                      inbound.
                     FileActivationSpec">
      <[..]>
      <[..]>
    </activation-spec>
  </endpoint-activation>
 
</adapter-config>
5.4.7.2 アウトバウンド操作

Oracleファイル/FTPアダプタでは、複数の参照が同じディレクトリに書き込まれた場合に相互に上書きされないことが保証されています。

アダプタは、データベース表を使用して、フォルダ内の同じファイルに対する同時書込みへのアクセスをシリアライズします。この手順はインバウンド操作の場合と同様であり、Oracle表を使用するeis/HAFileAdapterを選択するか、SQL Serverの場合はeis/HAFileAdapterMQSSQL、DB2の場合はeis/HAFileAdapterDB2をそれぞれ選択する必要があります。

ファイル/FTPアダプタでのインバウンド操作に対する高可用性と同様に、ファイル/FTPアダプタでアウトバウンド操作を実行する場合も、高可用性機能のためのCoherenceがサポートされています。設計の経験に基づいて、ファイル・アダプタの場合はeis/CoherenceHAFileAdapter、FTPアダプタの場合はeis/Ftp/CoherenceHAFtpAdapterを.jcaファイル内に指定する必要があります。

5.4.7.3 その他の考慮事項

ファイル/FTPアダプタでは、Coherenceをロッキング・メカニズムとして使用して、インバウンドとアウトバウンドの両方で高可用性をサポートしています。

5.4.7.3.1 インバウンド操作

インバウンド処理の場合、ファイル/FTPアダプタは、ファイル処理(ファイル変換を実行してファブリックにパブリッシュするなど)を試行する前にファイルをロックする必要があります。同じファイルに対するロックが別のノードによってすでに保持されている場合、アダプタはそのファイルを無視して、次のファイルの処理に進みます。

ある特定のノードがすべてのファイルに対するロックを取得してファイルの配信を独占することがないように、インバウンド処理に対してMaxRaiseSizeを有限値に構成する必要があります。次の例を参照してください。

例 - MaxRaiseSizeが有限値に構成された.jcaファイル

<adapter-config name="FileHACoherenceIn" adapter="File Adapter" wsdlLocation="FileHACoherenceIn.wsdl" xmlns="http://platform.integration.oracle/blocks/
            adapter/fw/metadata">
 
  <connection-factory location="eis/CoherenceHAFileAdapter" UIincludeWildcard="*.zip" adapterRef=""/>
  <endpoint-activation portType="Read_ptt" operation="Read">
    <activation-spec className="oracle.tip.adapter.file.inbound.FileActivationSpec">
      <property name="MaxRaiseSize" value="100"/>
      <[..]>
      <[..]>
    </activation-spec>
  </endpoint-activation>
 
</adapter-config>

また、(たとえば、Readonly pollingに対して) DeleteFile = "false"を構成した場合や、デバッチ処理を使用する場合は、クラスタ内のすべてのノードが同じパスを参照するように、有効な共有場所を構成する必要があります。いずれの場合も、ファイル/FTPアダプタはなんらかのコントロール情報を共有コントロール・ディレクトリに格納し、処理中に1つのノードが停止すると2つ目のノードがまったく同じコントロール情報を参照するため、これが必要となります。

独自のCoherenceキャッシュを指定するには、次のいずれかのパラメータを使用します。

  • CoherenceCacheConfig - Coherenceキャッシュ構成の相対パス

  • InboundCoherenceCacheName - インバウンドのファイル/FTPアダプタに使用されるCoherence NamedCache

  • OutboundCoherenceCacheName - アウトバウンドのファイル/FTPアダプタに使用されるCoherence NamedCache

独自のキャッシュ構成を作成する場合、キャッシュ構成をjarファイル内にバンドルして、サーバーのクラスパスに追加します(キャッシュ構成を含むjarファイルを$DOMAIN_HOME/libディレクトリにコピーしてから、コネクション・ファクトリ内の構成を参照する方法が簡単です)。デフォルト値が提供されています。

例 - 独自のCoherenceキャッシュの指定

<wls:properties>
             <wls:property>
                  <wls:name>CoherenceCacheConfig</wls:name>
                  <wls:value>config/
                      fileadapter-cache-config.xml</wls:value>
             </wls:property>
             <wls:property>
                  <wls:name>InboundCoherenceCacheName</wls:name>
                  <wls:value>FileAdapter-inbound</wls:value>
             </wls:property>
             <wls:property>
                  <wls:name>OutboundCoherenceCacheName</wls:name>
                  <wls:value>FileAdapter-outbound</wls:value>
             </wls:property>
             <wls:property../>
             <wls:property../>
         <wls:properties>
5.4.7.3.2 アウトバウンド操作

クラスタ内の同じファイルに追加する場合、アダプタが、追加先のfilename beginの名前付きキャッシュに対する明示的なロックを取得する必要があります。

また、バッチ処理を使用する場合、バッチ処理基準でアウトバウンド・フォルダへの書込みを強制するように評価される前に、バッチ処理されたコンテンツを格納するためのコントロール・ディレクトリが必要です。

アウトバウンドでのHAを実現するためには、アダプタには共有ファイル・システムに対するコントロール・ディレクトリが必要です(これはインバウンドでの機能と同様です)。

5.4.7.3.3 高可用性シナリオでのXAの構成

ノート:

ファイル/FTPアダプタ接続プールでXAトランザクションが有効になっている場合、WebLogicサーバーを起動するユーザーまたはプロセスは、ローカル・ホスト・マシン上にディレクトリおよびファイルを作成する権限を持っている必要があります。XAトランザクションでは、アダプタは、ローカルで転送されるファイルを、ターゲット・ディレクトリ構造がミラー化されているディレクトリ構造に保存する必要があります。アダプタのJCAファイルのPhysicalDirectoryプロパティを使用して、ミラー・ディレクトリの構造を作成します。たとえば、アダプタのJCAファイルに次が含まれている場合
<endpoint-interaction portType="Put_ptt" operation="Put"> <interaction-spec className="oracle.tip.adapter.ftp.outbound.FTPInteractionSpec"> <property name="PhysicalDirectory" value="/home/oracle"/>
アダプタはローカル・マシンに/home/oracleディレクトリを作成しようとします。ただし、アダプタの起動時にBPELでjca.file.Directoryプロパティが設定されている場合は、jca.file.Directoryプロパティで設定されたディレクトリが使用されます。

高可用性シナリオでXAトランザクション機能を提供するには:

  1. WebLogic Serverコンソールにログインし、「デプロイメント」→「ファイル・アダプタ」を選択します。

    図5-53 「デプロイメント」の「ファイル・アダプタ」が表示されたWebLogic Serverコンソール

    図5-53の説明が続きます
    「図5-53 「デプロイメント」の「ファイル・アダプタ」が表示されたWebLogic Serverコンソール」の説明
  2. 「構成」→「アウトバウンド接続プール」を選択します。

    図5-54 「アウトバウンド接続プール」が表示されたWebLogic Serverコンソール

    図5-54の説明が続きます
    「図5-54 「アウトバウンド接続プール」が表示されたWebLogic Serverコンソール」の説明
  3. 「新規」を選択します。oracle.tip.adapter.file.NonSharedConnectionFactoryを選択します。

    図5-55 「oracle.tip.adapter.file.NonSharedConnectionFactory」が選択されたWebLogic Serverコンソールのファイル・アダプタ・デプロイメント

    図5-55の説明が続きます
    「図5-55 「oracle.tip.adapter.file.NonSharedConnectionFactory」が選択されたWebLogic Serverコンソールのファイル・アダプタ・デプロイメント」の説明
  4. 新規の接続インスタンスに指定するJNDI名前を入力します。

    図5-56 新規インスタンスに指定されたJNDI名を示すWebLogic Serverコンソール

    図5-56の説明が続きます
    「図5-56 新規インスタンスに指定されたJNDI名を示すWebLogic Serverコンソール」の説明
  5. 「終了」および「保存」をクリックします。JNDIインスタンスを再度開き、次のアウトバウンド接続プロパティを入力します:

    図5-57 アウトバウンド接続プロパティが表示されたインスタンスを示すWebLogic Serverコンソール

    図5-57の説明が続きます
    「図5-57 アウトバウンド接続プロパティが表示されたインスタンスを示すWebLogic Serverコンソール」の説明

    表5-21も参照してください

    表5-21 JNDIインスタンスのアウトバウンド接続プロパティ

    プロパティ プロパティ・タイプ プロパティ値 動的索引付けのサポート

    ConferenceCacheConfig

    java.lang.string

    config/fileadpter-cache-config.xml

    False

    ControlDir

    java.lang.string

    /scratch/ha

    False

    InboundCoherenceCacheName

    java.lang.string

    FileAdapter-inbound

    False

    InboundDataSource

    java.lang.string

    jdbc/SOADataSource

    False

    IsTransacted

    java.lang.string

    false

    False

    OutboundCoherenceCacheName

    java.lang.string

    FileAdapter-outbound

    False

    OutboundDataSource

    java.lang.string

    jdbc/SOADataSource

    False

    OutboundDataSourceLocal

    java.lang.string

    jdbc/SOALocalTxDataSource

    False

    OutboundLockTypeForWrite

    java.lang.string

    oracle

    False

    WorkingDirectory

    java.lang.string

    default

    False

  6. 「トランザクション」タブの「XAトランザクション」を選択します。「保存」をクリックします。

    図5-58 WebLogicコンソールでの「トランザクション」タブの選択

    図5-58の説明が続きます
    「図5-58 WebLogicコンソールでの「トランザクション」タブの選択」の説明
  7. OSBを使用する場合は、次の追加タスクを実行する必要があります。
    • jdbc/SOALocalTXDataSourceデータソースを指定します(デフォルトで使用可能になっていないため)。

    • アウトバウンドXAの場合、ルーティング・オプションおよびパイプライン・トランザクションに対するQoS (Once-and-only once)が必要です。

    • インバウンドのローカル・トランザクションの場合、Check Pipeline transactionは必要ありません。

5.5 Oracleファイル/FTPアダプタの使用例

この項では、次のようなOracleファイル/FTPアダプタの使用例を示します。

5.5.1 Oracleファイル・アダプタのXMLデバッチ処理

これは、大きいXML文書を小さい個別のXMLフラグメントにデバッチするOracleファイル・アダプタ機能です。

この使用例では、XMLのデバッチ・プロセスでOracleファイル・アダプタを使用し、繰返しノードとしてXMLファイルで発生する従業員のバッチを含むXMLファイルをデバッチします。その後、アダプタによってこれらのノードが処理され、個々の各ノードが個別の出力ファイルに書き込まれます。

この項には次のトピックが含まれます:

5.5.1.1 前提条件

デバッチ処理を実行するには、まず次のファイルを作成する必要があります:

  • emps.xml

  • employees.xsd

emps.xmlの内容

<?xml version="1.0" encoding="UTF-8"?>
<employees
    xmlns="http://www.srimant.com/employees" >
<employee>
	<name>Cynthia Holmes</name>	
        <address>
                <addr_line1>38660 Lexington Street</addr_line1>
                <addr_line2></addr_line2>
                <state>California</state>
                <zip>94548</zip>
        </address>
</employee>
<employee>
	<name>Robert Patrick</name>	
        <address>
                <addr_line1>41688 Spring Dale Road</addr_line1>
                <addr_line2></addr_line2>
                <state>Ohio</state>
                <zip>94548</zip>
        </address>
</employee>
</employees>

employees.xsdの内容

<?xml version="1.0" encoding="UTF-8"?>
<schema targetNamespace="http://www.srimant.com/employees" xmlns:emp="http://www.srimant.com/employees" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" >
        <element name="employees" type="emp:employeesType"/>
        <complexType name="employeesType">
                <sequence>
                        <element ref="emp:employee"  minOccurs="0" maxOccurs="unbounded"/>
                </sequence>
        </complexType>
      <element name="employee" type="emp:employeeType"/>
        <complexType name="employeeType">
          <sequence>
              <element name="name" type="string"/>
              <element ref="emp:address" minOccurs="1" maxOccurs="1"/>
          </sequence>
        </complexType>
      <element name="address">
        <complexType>
          <sequence>
              <element name="addr_line1" type="string"/>
              <element name="addr_line2" type="string"/>
              <element name="state" type="string"/>
              <element name="zip" type="string"/>
          </sequence>
        </complexType>
      </element>
</schema>
5.5.1.2 反復要素を含む入力XMLドキュメントの分割

この項では、反復要素を含む入力XMLドキュメントをより小さいドキュメントに分割するプロセスについて説明します。これは、ファイル・アダプタまたはFTPアダプタでXMLデバッチ処理を使用する場合に役に立ちます。

nxsd:elementDepthは、XML構造の反復要素maxOccurs=’unboundedがルート要素の直下の子孫ではない場合に、XMLのデバッチ処理を促進するスキーマ・レベルの注釈です。nxsd:elementDepthの値は、XSDに定義されたXML構造に準拠する必要があります。

反復要素を含むXMLドキュメントの例

<root>
<ElementList>
	<element1>
		<element11>11</element11>
		<element12>12</element12>
	</element1>
	<element1>
		<element11>21</element11>
		<element12>22</element12>
	</element1>
	<element1>
		<element11>31</element11>
		<element12>32</element12>
	</element1>
</ElementList>
</root>

反復要素を含むXMLドキュメントを分割する手順

ノート:

設計時に正しい値を適用します。正しい値は、ルート要素の下から始まるレベルの数です。値が正しくないと、予期しない結果が発生し、無効なXMLドキュメントが生成されます。たとえば、次のスキーマで必要な出力を得るためには、反復要素<element1>がルート要素<root>の2レベル下に位置するので、nxsd:elementDepthは2に設定する必要があります。

必要な出力を生成するには、 xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd" nxsd:elementDepth="2"を追加して、XMLスキーマを変更します

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.examplefileIn.org"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd" nxsd:elementDepth="2"
targetNamespace="http://www.examplefileIn.org"
elementFormDefault="qualified">
<xsd:element name="root">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="ElementList">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="element1" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="element11" type="xsd:string"/>
<xsd:element name="element12" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
5.5.1.3 SOAコンポジットの設計

SOAコンポジットを含んだJDeveloperアプリケーションを作成する必要があります。使用例のアプリケーションとプロジェクトを作成する手順は、次のとおりです。

  1. JDeveloper「アプリケーション・ナビゲータ」で、「新規アプリケーション」をクリックします。「汎用アプリケーションの作成 - アプリケーションの名前付け」ページが表示されます。
  2. 図5-59に示すように、「アプリケーション名」フィールドにSOA-XMLDebatchingと入力して「次へ」をクリックします。「汎用アプリケーションの作成 - プロジェクトの名前付け」ページが表示されます。

    図5-59 「汎用アプリケーションの作成 - アプリケーションの名前付け」ページ

    「汎用アプリケーションの作成 - アプリケーションの名前付け」ページ
  3. 「プロジェクト名」フィールドにXMLDebatchingと入力します。
  4. 図5-60に示すように、「プロジェクト・テクノロジ」タブの「選択可能」リストで「SOA」をダブルクリックして、「選択済」リストに移動します。

    図5-60 「汎用アプリケーションの作成 - プロジェクトの名前付け」ページ

    「汎用アプリケーションの作成 - プロジェクトの名前付け」ページ
  5. 「次へ」をクリックします。「SOA設定の構成」ダイアログが表示されます。
  6. 図5-61に示すように、「コンポジット・テンプレート」ボックスで「BPELを使用するコンポジット」を選択して「終了」をクリックします。「BPELプロセスの作成 - BPELプロセス」ページが表示されます。

    図5-61 「汎用アプリケーションの作成 - SOA設定の構成」ページ

    「汎用アプリケーションの作成 - SOA設定の構成」ページ
  7. 図5-62に示すように、「名前」フィールドにBPELXMLDebatchingと入力し、「テンプレート」ボックスから「サービスを後で定義」を選択します。

    図5-62 「BPELプロセスの作成 - BPELプロセス」ページ

    「BPELプロセスの作成 - BPELプロセス」ページ
  8. 「OK」をクリックします。図5-63に示すように、SOA-XMLDebatchingアプリケーションとXMLDebatchingプロジェクトが設計領域に表示されます。

    図5-63 JDeveloper - 「composite.xml」ページ

    「開発者 - composite.xml」ページ
  9. 作成したemployees.xsdファイル(「前提条件」を参照)をプロジェクトのxsdディレクトリにコピーします。
5.5.1.4 インバウンドOracleファイル・アダプタ・サービスの作成

ローカル・ディレクトリからファイルを読み取るインバウンドのOracleファイル・アダプタ・サービスを作成するには、次のステップを実行します。

  1. Oracleファイル・アダプタを、「コンポーネント」ウィンドウから「公開されたサービス」スイムレーンにドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
  2. 「サービス名」フィールドにXMLDebatchingInと入力して「次へ」をクリックします。

    図5-64 「アダプタ構成ウィザード - サービス名」ページ

    図5-64の説明が続きます
    「図5-64 「アダプタ構成ウィザード - サービス名」ページ」の説明
  3. 「アダプタ・インタフェース」画面で「操作およびスキーマから定義(後で指定)」を選択し、「次へ」をクリックします。
  4. 「FTPサーバー接続」画面で「FTPサーバーのJNDI名」に入力し、「次へ」をクリックします。
  5. 「操作」画面で「ファイルの読取り」を選択し、「次へ」をクリックします。

    図5-65 「アダプタ構成ウィザード - 操作」ページ

    図5-65の説明が続きます
    「図5-65 「アダプタ構成ウィザード - 操作」ページ」の説明
  6. 「ファイル・ディレクトリ」画面で入力ディレクトリの物理パスを入力し、「次」をクリックします。

    図5-66 「アダプタ構成ウィザード - ファイル・ディレクトリ」ページ

    図5-66の説明が続きます
    「図5-66 「アダプタ構成ウィザード - ファイル・ディレクトリ」ページ」の説明
  7. 「インクルード・ファイルの名前パターン」フィールドに*.xmlと入力し、「ファイルが複数のメッセージを含む」を選択し、「ファイルのフィルタ処理」画面の「バッチでメッセージをパブリッシュする数」ボックスの値として1を指定し、「次」をクリックします。

    図5-67 「アダプタ構成ウィザード - ファイルのフィルタ処理」ページ

    図5-67の説明が続きます
    「図5-67 「アダプタ構成ウィザード - ファイルのフィルタ処理」ページ」の説明
  8. 「ファイル・ポーリング」画面で「次へ」をクリックします。
  9. 「メッセージ」画面で、「URL」フィールドの最後に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
  10. 「プロジェクトのスキーマ・ファイル」employees.xsdおよびemployeesをクリックします。

    図5-68 「タイプ・チューザ」ダイアログ

    図5-68の説明が続きます
    「図5-68 「タイプ・チューザ」ダイアログ」の説明
  11. 「OK」をクリックします。「メッセージ」ページの「URL」フィールドにemployees.xsdファイルが移入されます。

    図5-69 「アダプタ構成ウィザード - メッセージ」ページ

    図5-69の説明が続きます
    「図5-69 「アダプタ構成ウィザード - メッセージ」ページ」の説明
  12. 「次へ」をクリックします。
  13. 「JCAエンドポイント・プロパティ」画面で、「次」をクリックします。
    「参照構成」オプションを選択した場合、「JCAエンドポイント・プロパティ」画面が表示されます。詳細は、「アダプタ構成ウィザードのJCAエンドポイント・プロパティ」を参照してください。
  14. 「終了」をクリックします。インバウンドのOracleファイル・アダプタが構成され、composite.xmlが表示されます。

    図5-70 JDeveloper - composite.xml

    図5-70の説明が続きます
    「図5-70 JDeveloper - composite.xml」の説明
5.5.1.5 アウトバウンドOracleファイル・アダプタ・サービスの作成

ローカル・ディレクトリからFTPサーバーにファイルを書き込むアウトバウンドのOracleファイル・アダプタ・サービスを作成するには、次のステップを実行します。

  1. 「コンポーネント」ウィンドウから「外部参照」スイムレーンにOracleファイル・アダプタをドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
  2. 「サービス名」フィールドにXMLOutと入力して「次へ」をクリックします。
  3. 「操作およびスキーマから定義(後で指定)」を選択し、「アダプタ・インタフェース」ページで「次へ」をクリックします。
  4. 「FTPサーバー接続」画面で「FTPサーバーのJNDI名」に入力し、「次へ」をクリックします。
  5. 「ファイルの書込み」を選択し、「操作」画面で「次へ」をクリックします。
  6. 「ファイル構成」画面で:
    1. 出力ディレクトリの物理パスを入力し、emp_%SEQ%.xml「ファイル・ネーミング規則(po_%SEQ%.txt)」フィールドに入力します。
    2. 「メッセージ数の到達」を選択して「次」をクリックします。
      デフォルト値は、1です。

      図5-71 「アダプタ構成ウィザード - ファイル構成」ページ

      図5-71の説明が続きます
      「図5-71 「アダプタ構成ウィザード - ファイル構成」ページ」の説明
  7. 「メッセージ」画面で:
    1. 「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
    2. 「プロジェクトのスキーマ・ファイル」employees.xsdおよびemployeeをクリックします。
    3. 「OK」をクリックします。
      「メッセージ」ページの「URL」フィールドにemployees.xsdファイルが移入されます
  8. 「JCAエンドポイント・プロパティ」画面で、「次」をクリックします。
    「参照構成」オプションを選択した場合、「JCAエンドポイント・プロパティ」画面が表示されます。詳細は、「アダプタ構成ウィザードのJCAエンドポイント・プロパティ」を参照してください。
  9. 「終了」をクリックします。アウトバウンドのOracleファイル・アダプタが構成され、composite.xmlが表示されます。

    図5-72 JDeveloper - composite.xml

    図5-72の説明が続きます
    「図5-72 JDeveloper - composite.xml」の説明
5.5.1.6 サービスとアクティビティのワイヤリング

作成した3つのコンポーネント(インバウンド・アダプタ・サービス、BPELプロセス、アウトバウンド・アダプタ参照)をアセンブルまたは接続する必要があります。コンポーネントを接続するステップは、次のとおりです。

  1. 「公開されたサービス」領域にあるXMLDebatchingIn内の小さい三角形を、「コンポーネント」領域のBPELプロセス内に緑の三角形として表示されるドロップ・ゾーンにドラッグします。
  2. 「コンポーネント」領域にあるBPELプロセス内の小さい三角形を、「外部参照」領域のXMLOut内に緑の三角形として表示されるドロップ・ゾーンにドラッグします。

    JDevelopercomposite.xml図5-73のように表示されます。

    図5-73 JDeveloper - composite.xml

    図5-73の説明が続きます
    「図5-73 JDeveloper - composite.xml」の説明
  3. 「ファイル」「すべて保存」を順番にクリックします。
5.5.1.6.1 receiveアクティビティの追加
  1. 「BPELXMLDebatching」をダブルクリックします。「BPELXMLDebatching.bpel」ページが表示されます。
  2. 「コンポーネント」ウィンドウから設計領域にreceiveアクティビティをドラッグ・アンド・ドロップします。
  3. receiveアクティビティをダブルクリックします。「Receive」ダイアログが表示されます。
  4. 図5-74に示すように、「名前」フィールドにReceiveEmployeeと入力します。

    図5-74 JDeveloper - BPELXMLDebatching.bpel

    図5-74の説明が続きます
    「図5-74 JDeveloper - BPELXMLDebatching.bpel」の説明
  5. 「パートナ・リンク」フィールドの端にある「パートナ・リンクの参照」をクリックします。「パートナ・リンク・チューザ」ダイアログが表示されます。
  6. 図5-75に示すように、「XMLDebatchingIn」を選択して「OK」をクリックします。

    図5-75 「パートナ・リンク・チューザ」ダイアログ

    図5-75の説明が続きます
    「図5-75 「パートナ・リンク・チューザ」ダイアログ」の説明
  7. 図5-76に示すように、「Receive」ダイアログで「変数」フィールドの右にある「変数の自動作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。

    図5-76 「Receive」ダイアログ

    図5-76の説明が続きます
    「図5-76 「Receive」ダイアログ」の説明
  8. デフォルトの変数名を選択し、「OK」をクリックします。デフォルトの変数名が「変数」フィールドに移入されます。
  9. 「インスタンスの作成」を選択して、「OK」をクリックします。図5-77に示すように、JDeveloperの「BPELXMLDebatching.bpel」ページが表示されます。

    図5-77 JDeveloper - BPELXMLDebatching.bpel

    図5-77の説明が続きます
    「図5-77 JDeveloper - BPELXMLDebatching.bpel」の説明
5.5.1.6.2 invokeアクティビティの追加
  1. 「コンポーネント」ウィンドウから設計領域にinvokeアクティビティをドラッグ・アンド・ドロップします。
  2. invokeアクティビティをダブルクリックします。Invokeダイアログが表示されます。
  3. 図5-78に示すように、「名前」フィールドにWriteEmployeeと入力します。

    図5-78 「Invoke」ダイアログ

    図5-78の説明が続きます
    「図5-78 「起動」ダイアログ」の説明
  4. 「パートナ・リンク」フィールドの端にある「パートナ・リンクの参照」をクリックします。「パートナ・リンク・チューザ」ダイアログが表示されます。
  5. 図5-79に示すように、「XMLOut」を選択して「OK」をクリックします。

    図5-79 「パートナ・リンク・チューザ」ダイアログ

    図5-79の説明が続きます
    「図5-79 「パートナ・リンク・チューザ」ダイアログ」の説明
  6. 「Invoke」ダイアログで、「入力変数」フィールドの右にある「入力変数の自動作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。
  7. デフォルトの変数名を選択し、「OK」をクリックします。デフォルトの変数名が「変数」フィールドに移入されます。図5-80に示すように、Invokeダイアログが表示されます。

    図5-80 「Invoke」ダイアログ

    図5-80の説明が続きます
    「図5-80 「起動」ダイアログ」の説明
  8. 「OK」をクリックします。図5-81に示すように、JDeveloperの「BPELXMLDebatching.bpel」ページが表示されます。

    図5-81 JDeveloper - BPELXMLDebatching.bpel

    図5-81の説明が続きます
    「図5-81 JDeveloper - BPELXMLDebatching.bpel」の説明
5.5.1.6.3 transformアクティビティの追加
  1. 「コンポーネント」ウィンドウから設計領域のreceiveアクティビティとinvokeアクティビティの間にtransformアクティビティをドラッグ・アンド・ドロップします。
  2. transformアクティビティをダブルクリックします。「Transform」ダイアログが表示されます。
  3. 図5-82に示すように、「名前」フィールドにTransformPayloadと入力します。

    図5-82 「Transform」ダイアログ

    図5-82の説明が続きます
    「図5-82 「Transform」ダイアログ」の説明
  4. 「トランスフォーメーション」タブをクリックします。図5-83に示すように、「Transform」ダイアログが表示されます。

    図5-83 「Transform」ダイアログ - 「トランスフォーメーション」タブ

    図5-83の説明が続きます
    「図5-83 「Transform」ダイアログ - 「トランスフォーメーション」タブ」の説明
  5. 「作成」アイコンをクリックします。「ソース変数」ダイアログが表示されます。
  6. 「ソース変数」ボックスで「ReceiveEmployee_Read_InputVariable」を選択し、「ソース・パート」ボックスで「employees」を選択して「OK」をクリックします。「ソース」と「パート」が選択された状態で「変換」ダイアログが表示されます。
  7. 図5-84に示すように、「ターゲット変数」リストで「WriteEmployee_Write_InputVariable」を選択し、「ターゲット・パート」で「employee」を選択します。

    図5-84 「Transform」ダイアログ

    図5-84の説明が続きます
    「図5-84 「Transform」ダイアログ」の説明
  8. 「マッピングの作成」アイコンをクリックします。「XSLエディタ」ページが表示されます。
  9. 図5-85に示すように、ソースからemployeesをターゲットのemployeeにドラッグします。「自動マップ・プリファレンス」ダイアログが表示されます。

    図5-85 JDeveloper - Transformation_2.xsl

    図5-85の説明が続きます
    「図5-85 JDeveloper - Transformation_2.xsl」の説明
  10. 「OK」をクリックします。
  11. 「ファイル」「すべて保存」を順番にクリックします。
  12. 「XSLエディタ」ページを閉じます。図5-86に示すように、「BPELXMLDebatching.bpel」ページが表示されます。

    図5-86 JDeveloper - XMLデバッチ処理の完了

    図5-86の説明が続きます
    「図5-86 JDeveloper - XMLデバッチ処理の完了」の説明
5.5.1.7 JDeveloperを使用したデプロイ

前述のステップで作成したSOAプロジェクトおよびアプリケーションについて、アプリケーション・プロファイルをデプロイする必要があります。JDeveloperを使用してアプリケーション・プロファイルをデプロイするには、次のステップを実行する必要があります。

  1. アプリケーション・サーバー接続を作成します。詳細は、「Oracle JCAアダプタ用のアプリケーション・サーバー接続の作成」を参照してください。
  2. アプリケーションをデプロイします。詳細は、「JDeveloperからのOracle JCAアダプタ・アプリケーションのデプロイ」を参照してください。
5.5.1.8 Oracle Fusion Middleware Controlコンソールを使用した監視

Fusion Middleware Controlコンソールを使用して、デプロイ済のSOAコンポジットを監視できます。次のステップを実行します。

  1. http://servername:portnumber/emにナビゲートします。デプロイしたコンポジットがアプリケーション・ナビゲータに表示されます。
  2. 作成したemps.xmlファイル(「前提条件」を参照)を入力ディレクトリにコピーし、処理済であることを確認します。出力ディレクトリを調べて、出力ファイルが作成されていることを確認します。
  3. デプロイしたSOAコンポジットをクリックします。「ダッシュボード」が表示されます。

    「最新のインスタンス」領域で「インスタンスID」の値をノートにとります。

  4. 「インスタンス」タブをクリックします。SOAコンポジットのインスタンスIDがリスト表示されます。
  5. ステップ3でメモしたインスタンスIDをクリックします。「フローのトレース」ページが表示されます。
  6. BPELプロセス・インスタンスをクリックします。BPELプロセス・インスタンスの「監査証跡」が表示されます。
  7. ペイロード・ノードを開いてペイロード詳細を確認します。
  8. プロセス・フローを表示するには、「フロー」タブをクリックします。アクティビティをクリックして、アクティビティの詳細を表示します

5.5.2 Oracle BPEL PMのフラット構造

この使用例では、フラット構造のビジネス・プロセスでOracleファイル・アダプタを使用して、カンマ区切り値(CSV)ファイルのアドレス帳エントリを処理する方法について説明します。これらのエントリは、その後変換されて固定長フォーマットで別のファイルに書き込まれます。

この項には次のトピックが含まれます:

5.5.2.1 前提条件

フラット構造のビジネス・プロセスを実行するには、まず次のファイルを作成する必要があります:

  • address-csv.txt

  • address-csv.xsd

  • address-fixedLength.xsd

  • addr1Toaddr2.xsl

address-csv.txtの内容

Name,Street1,Street2,City,State,Country
Oracle India Private Limited, Lexington Towers Prestige St. John's Woods, 2nd Cross Road Chikka Audugodi, Bangalore, Karnataka, India
Intel Technology India Private Limited, Survey #23-56 P Devarabeesanahalli Village, Outer Ring Road Varthur Hobli, Bangalore, Karnataka, India

address-csv.xsdの内容

<?xml version="1.0" ?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
            targetNamespace="http://xmlns.oracle.com/pcbpel/demoSchema/csv"
            xmlns:tns="http://xmlns.oracle.com/pcbpel/demoSchema/csv"
            elementFormDefault="qualified"
            attributeFormDefault="unqualified" nxsd:encoding="US-ASCII" nxsd:hasHeader="true" nxsd:headerLines="1" nxsd:linesTerminatedBy="${eol}" nxsd:stream="chars" nxsd:version="NXSD">
  <xsd:element name="Root-Element">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="Address" minOccurs="1" maxOccurs="unbounded">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="Name" type="xsd:string" nxsd:style="terminated" nxsd:terminatedBy="," nxsd:quotedBy="&quot;">
              </xsd:element>
              <xsd:element name="Street1" type="xsd:string" nxsd:style="terminated" nxsd:terminatedBy="," nxsd:quotedBy="&quot;">
              </xsd:element>
              <xsd:element name="Street2" type="xsd:string" nxsd:style="terminated" nxsd:terminatedBy="," nxsd:quotedBy="&quot;">
              </xsd:element>
              <xsd:element name="City" type="xsd:string" nxsd:style="terminated" nxsd:terminatedBy="," nxsd:quotedBy="&quot;">
              </xsd:element>
              <xsd:element name="State" type="xsd:string" nxsd:style="terminated" nxsd:terminatedBy="," nxsd:quotedBy="&quot;">
              </xsd:element>
              <xsd:element name="Country" type="xsd:string" nxsd:style="terminated" nxsd:terminatedBy="${eol}" nxsd:quotedBy="&quot;">
              </xsd:element>
            </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>
<!--NXSDWIZ:D:\work\jDevProjects\BPEL\FlatStructure\address-csv.txt:-->

address-fixedLength.xsdの内容

<?xml version="1.0" ?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
            targetNamespace="http://xmlns.oracle.com/pcbpel/demoSchema/fixedLength"
            xmlns:fix="http://xmlns.oracle.com/pcbpel/demoSchema/fixedLength"
            elementFormDefault="qualified"
            attributeFormDefault="unqualified" nxsd:encoding="US-ASCII" nxsd:stream="chars" nxsd:version="NXSD">
  <xsd:element name="Root-Element">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="Address" minOccurs="1" maxOccurs="unbounded" nxsd:style="array" nxsd:cellSeparatedBy="\r\n">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="Name" type="xsd:string" nxsd:style="fixedLength" nxsd:length="38">
              </xsd:element>
              <xsd:element name="Street" type="xsd:string" nxsd:style="fixedLength" nxsd:length="80">
              </xsd:element>
              <xsd:element name="City" type="xsd:string" nxsd:style="fixedLength" nxsd:length="11">
              </xsd:element>
              <xsd:element name="State" type="xsd:string" nxsd:style="fixedLength" nxsd:length="11">
              </xsd:element>
              <xsd:element name="Country" type="xsd:string" nxsd:style="fixedLength" nxsd:length="7">
              </xsd:element>
            </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>
<!--NXSDWIZ:C:\orabpel\samples\tutorials\121.FileAdapter\FlatStructure\outputDir\csv_2004.11.10.txt:-->

addr1Toaddr2.xslの内容

<?xml version="1.0" encoding="windows-1252"?>
<?oracle-xsl-mapper
  <!-- SPECIFICATION OF MAP SOURCES AND TARGETS, DO NOT MODIFY. -->
  <mapSources>
    <source type="XSD">
      <schema location="xsd/address-csv.xsd"/>
      <rootElement name="Root-Element" namespace="http://xmlns.oracle.com/pcbpel/demoSchema/csv"/>
    </source>
  </mapSources>
  <mapTargets>
    <target type="XSD">
      <schema location="xsd/address-fixedLength.xsd"/>
      <rootElement name="Root-Element" namespace="http://xmlns.oracle.com/pcbpel/demoSchema/fixedLength"/>
    </target>
  </mapTargets>
  <!-- GENERATED BY ORACLE XSL MAPPER 1.0 AT [TUE NOV 16 16:14:01 IST 2004]. -->
?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                xmlns:tns="http://xmlns.oracle.com/pcbpel/demoSchema/csv"
                xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
                xmlns:fix="http://xmlns.oracle.com/pcbpel/demoSchema/fixedLength"
                exclude-result-prefixes="xsl xsd tns nxsd fix">
  <xsl:template match="/">
    <fix:Root-Element>
      <xsl:for-each select="/tns:Root-Element/tns:Address">
        <fix:Address>
          <fix:Name>
            <xsl:value-of select="tns:Name"/>
          </fix:Name>
          <fix:Street>
            <xsl:value-of select="concat(tns:Street1,tns:Street2)"/>
          </fix:Street>
          <fix:City>
            <xsl:value-of select="tns:City"/>
          </fix:City>
          <fix:State>
            <xsl:value-of select="tns:State"/>
          </fix:State>
          <fix:Country>
            <xsl:value-of select="tns:Country"/>
          </fix:Country>
        </fix:Address>
      </xsl:for-each>
    </fix:Root-Element>
  </xsl:template>
</xsl:stylesheet>
5.5.2.2 SOAコンポジットの設計

SOAコンポジットを含んだJDeveloperアプリケーションを作成する必要があります。使用例のアプリケーションとプロジェクトを作成するステップは、次のとおりです。

  1. JDeveloper「アプリケーション・ナビゲータ」で、「新規アプリケーション」をクリックします。「汎用アプリケーションの作成 - アプリケーションの名前付け」ページが表示されます。
  2. 「アプリケーション名」フィールドにSOA-FlatStructureと入力して「OK」をクリックします。「汎用アプリケーションの作成 - プロジェクトの名前付け」ページが表示されます。
  3. 「プロジェクト名」FlatStructureと入力します。
  4. 「プロジェクト・テクノロジ」タブの「選択可能」リストで「SOA」をダブルクリックし、「選択済」リストに移動します。
  5. 「次へ」をクリックします。「SOA設定の構成」ダイアログが表示されます。
  6. 「コンポジット・テンプレート」ボックスで「BPELを使用するコンポジット」を選択して「終了」をクリックします。「BPELプロセスの作成 - BPELプロセス」ページが表示されます。
  7. 「名前」フィールドにBPELFlatStructureと入力し、「テンプレート」ボックスから「サービスを後で定義」を選択します。
  8. 「OK」をクリックします。図5-87に示すように、SOA-FlatStructureアプリケーションとFlatStructureプロジェクトが設計領域に表示されます。

    図5-87 JDeveloper - composite.xml

    図5-87の説明が続きます
    「図5-87 JDeveloper - composite.xml」の説明
  9. 作成したaddress-csv.xsdおよびaddress-fixedLength.xsdファイル(「前提条件」を参照)をプロジェクトのスキーマ・ディレクトリにコピーします。
  10. 作成したaddr1Toaddr2.xsl (「前提条件」を参照)をプロジェクトのxslディレクトリにコピーします。
5.5.2.3 インバウンドOracleファイル・アダプタ・サービスの作成

ローカル・ディレクトリからファイルを読み取るインバウンドのOracleファイル・アダプタ・サービスを作成するには、次のステップを実行します。

  1. 「コンポーネント」ウィンドウから「公開されたサービス」スイムレーンにファイル・アダプタをドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
  2. 「サービス名」フィールドにFlatStructureInと入力して「次へ」をクリックします。
  3. 「アダプタ・インタフェース」画面で「操作およびスキーマから定義(後で指定)」を選択し、「次へ」をクリックします。
  4. 「FTPサーバー接続」画面で「FTPサーバーのJNDI名」に入力し、「次へ」をクリックします。
  5. 「操作」画面で「ファイルの読取り」を選択し、「次へ」をクリックします。
  6. 「ファイル・ディレクトリ」画面で入力ディレクトリの物理パスを入力します。「処理済ファイルをアーカイブ」を選択します。
  7. 処理済ファイルのアーカイブ・ディレクトリの物理パスを入力して、「次へ」をクリックします。
  8. 「インクルード・ファイルの名前パターン」フィールドに*.txtと入力し、「ファイルのフィルタ処理」画面で「次へ」をクリックします。
  9. 「次へ」をクリックすると、「ファイル・ポーリング」ページが表示されます。
  10. 「メッセージ」画面で、次を行います。
    1. 「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。
      「タイプ・チューザ」ダイアログが表示されます。
    2. 「プロジェクトのスキーマ・ファイル」「address-csv.xsd」および「Root-Element」を順番にクリックします。
    3. 「OK」をクリックします。
      「メッセージ」ページの「URL」フィールドにaddress-csv.xsdファイルが移入されます。
    4. 「次」をクリックします
  11. 「JCAエンドポイント・プロパティ」画面で、「次へ」をクリックします。
    参照構成オプションを選択した場合、「JCAエンドポイント・プロパティ」画面が表示されます。詳細は、「アダプタ構成ウィザードのJCAエンドポイント・プロパティ」を参照してください。
  12. 「終了」をクリックします。インバウンドのOracleファイル・アダプタが構成され、composite.xmlが表示されます。

    図5-88 JDeveloper - composite.xml

    図5-88の説明が続きます
    「図5-88 JDeveloper - composite.xml」の説明
5.5.2.4 アウトバウンドOracleファイル・アダプタ・サービスの作成

ローカル・ディレクトリからFTPサーバーにファイルを書き込むアウトバウンドのOracleファイル・アダプタ・サービスを作成するには、次のステップを実行します。

  1. 「コンポーネント」ウィンドウから「外部参照」スイムレーンにファイル・アダプタをドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
  2. 「サービス名」フィールドにFlatStructureOutと入力して「次へ」をクリックします。
  3. 「アダプタ・インタフェース」画面で「操作およびスキーマから定義(後で指定)」を選択し、「次へ」をクリックします。
  4. 「FTPサーバー接続」画面で「FTPサーバーのJNDI名」に入力し、「次へ」をクリックします。
  5. 「ファイルの書込み」を選択し、「操作」画面で「次へ」をクリックします。
  6. 「ファイル構成」画面で、出力ディレクトリの物理パスを入力し、「ファイル・ネーミング規則(po_%SEQ%.txt)」フィールドにaddress_%SEQ%.dataと入力し、「次へ」をクリックします。
  7. 「メッセージ」画面で、次を行います。
    1. 「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。
      「タイプ・チューザ」ダイアログが表示されます。
    2. 「プロジェクトのスキーマ・ファイル」「address-fixedLength.xsd」および「Root-Element」を順番にクリックします。
    3. 「OK」をクリックします。
      「メッセージ」ページの「URL」フィールドにaddress-fixedLength.xsdファイルが移入されます。
    4. 「次」をクリックします
  8. 「JCAエンドポイント・プロパティ」画面で、「次へ」をクリックします。
    参照構成オプションを選択した場合、「JCAエンドポイント・プロパティ」画面が表示されます。詳細は、「アダプタ構成ウィザードのJCAエンドポイント・プロパティ」を参照してください。
  9. 「終了」をクリックします。アウトバウンドのOracleファイル・アダプタが構成され、composite.xmlが表示されます。

    図5-89 JDeveloper - composite.xml

    図5-89の説明が続きます
    「図5-89 JDeveloper - composite.xml」の説明
5.5.2.5 サービスとアクティビティのワイヤリング

作成した3つのコンポーネント(インバウンド・アダプタ・サービス、BPELプロセス、アウトバウンド・アダプタ参照)をアセンブルまたは接続する必要があります。コンポーネントを接続するステップは、次のとおりです。

  1. 「公開されたサービス」領域にあるFlatStructureIn内の小さい三角形を、「コンポーネント」領域のBPELプロセス内に緑の三角形として表示されるドロップ・ゾーンにドラッグします。
  2. 「コンポーネント」領域にあるBPELプロセス内の小さい三角形を、「外部参照」領域のFlatStructureOut内に緑の三角形として表示されるドロップ・ゾーンにドラッグします。

    JDevelopercomposite.xml図5-90のように表示されます。

    図5-90 JDeveloper - composite.xml

    図5-90の説明が続きます
    「図5-90 JDeveloper - composite.xml」の説明
  3. 「ファイル」「すべて保存」を順番にクリックします。
5.5.2.5.1 receiveアクティビティの追加
  1. 「BPELFlatStructure」をダブルクリックします。「BPELFlatStructure.bpel」ページが表示されます。
  2. 「コンポーネント」ウィンドウから設計領域にreceiveアクティビティをドラッグ・アンド・ドロップします。
  3. receiveアクティビティをダブルクリックします。「Receive」ダイアログが表示されます。
  4. 「名前」フィールドにReceiveCSVと入力します。
  5. 「パートナ・リンク」フィールドの端にある「パートナ・リンクの参照」をクリックします。「パートナ・リンク・チューザ」ダイアログが表示されます。
  6. 「FlatStructureIn」を選択して「OK」をクリックします。
  7. 「Receive」ダイアログで、「変数」フィールドの右にある「変数の自動作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。
  8. デフォルトの変数名を選択し、「OK」をクリックします。デフォルトの変数名が「変数」フィールドに移入されます。
  9. 「インスタンスの作成」を選択して、「OK」をクリックします。図5-91に示すように、JDeveloperの「BPELFlatStructure.bpel」ページが表示されます。

    図5-91 JDeveloper - BPELFlatStructure.bpel

    図5-91の説明が続きます
    「図5-91 JDeveloper - BPELFlatStructure.bpel」の説明
5.5.2.5.2 invokeアクティビティの追加
  1. 「コンポーネント」ウィンドウから設計領域にinvokeアクティビティをドラッグ・アンド・ドロップします。
  2. invokeアクティビティをダブルクリックします。「Invoke」ダイアログが表示されます。
  3. 「名前」フィールドにInvokeWriteと入力します。
  4. 「パートナ・リンク」フィールドの端にある「パートナ・リンクの参照」をクリックします。「パートナ・リンク・チューザ」ダイアログが表示されます。
  5. 「FlatStructureOut」を選択して「OK」をクリックします。
  6. 「Invoke」ダイアログで、「入力変数」フィールドの右にある「入力変数の自動作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。
  7. デフォルトの変数名を選択し、「OK」をクリックします。デフォルトの変数名が「変数」フィールドに移入されます。
  8. 「OK」をクリックします。図5-92に示すように、JDeveloperの「BPELFlatStructure.bpel」ページが表示されます。

    図5-92 JDeveloper - BPELFlatStructure.bpel

    図5-92の説明が続きます
    「図5-92 JDeveloper - BPELFlatStructure.bpel」の説明
5.5.2.5.3 transformアクティビティの追加
  1. 「コンポーネント」ウィンドウから設計領域のreceiveアクティビティとinvokeアクティビティの間にtransformアクティビティをドラッグ・アンド・ドロップします。
  2. transformアクティビティをダブルクリックします。「Transform」ダイアログが表示されます。
  3. 「名前」フィールドにTransformPayloadと入力します。
  4. 「トランスフォーメーション」タブをクリックします。「Transform」ダイアログが表示されます。
  5. 「作成」アイコンをクリックします。「ソース変数」ダイアログが表示されます。
  6. 「ソース変数」ボックスで「ReceiveCSV_Read_InputVariable」を選択し、「ソース・パート」ボックスで「body」を選択して「OK」をクリックします。「ソース」と「パート」が選択された状態で「変換」ダイアログが表示されます。
  7. 「ターゲット変数」リストで「InvokeWrite_Write_InputVariable」を選択し、「ターゲット・パート」で「body」を選択します。
  8. 「マッパー・ファイル」フィールドの端にある「参照」ボタンをクリックし、プロジェクトのxslディレクトリからaddr1Toaddr2.xslファイルを選択します。
  9. 「OK」をクリックします。
  10. 「ファイル」「すべて保存」を順番にクリックします。図5-93に示すように、「BPELFlatStructure.bpel」ページが表示されます。

    図5-93 JDeveloper - BPELFlatStructure.bpel

    図5-93の説明が続きます
    「図5-93 JDeveloper - BPELFlatStructure.bpel」の説明
5.5.2.6 JDeveloperを使用したデプロイ

前述のステップで作成したSOAプロジェクトおよびアプリケーションについて、アプリケーション・プロファイルをデプロイする必要があります。JDeveloperを使用してアプリケーション・プロファイルをデプロイするには、次のステップを実行する必要があります。

  1. アプリケーション・サーバー接続を作成します。詳細は、「Oracle JCAアダプタ用のアプリケーション・サーバー接続の作成」を参照してください。
  2. アプリケーションをデプロイします。詳細は、「JDeveloperからのOracle JCAアダプタ・アプリケーションのデプロイ」を参照してください。
5.5.2.7 Oracle Fusion Middleware Controlコンソールを使用した監視

Fusion Middleware Controlコンソールを使用して、デプロイ済のSOAコンポジットを監視できます。次のステップを実行します。

  1. http://servername:portnumber/emにナビゲートします。デプロイしたコンポジットがアプリケーション・ナビゲータに表示されます。
  2. 作成したaddress-csv.txtファイル(「前提条件」を参照)を入力ディレクトリにコピーし、処理済であることを確認します。出力ディレクトリを調べて、出力ファイルが作成されていることを確認します。
  3. デプロイしたSOAコンポジットをクリックします。「ダッシュボード」が表示されます。

    「最新のインスタンス」領域で「インスタンスID」の値をノートにとります。

  4. 「インスタンス」タブをクリックします。SOAコンポジットのインスタンスIDがリスト表示されます。
  5. ステップ3でメモしたインスタンスIDをクリックします。「フローのトレース」ページが表示されます。
  6. BPELプロセス・インスタンスをクリックします。BPELプロセス・インスタンスの「監査証跡」が表示されます。
  7. ペイロード・ノードを開いてペイロード詳細を確認します。
  8. プロセス・フローを表示するには、「フロー」タブをクリックします。アクティビティをクリックして、アクティビティの詳細を表示します。
  9. 「ReceiveCSV」をクリックしてアクティビティ詳細を表示します。

5.5.3 メディエータのフラット構造

この使用例では、メディエータReadFileというインバウンドOracleファイル・アダプタ・サービスを介して、ファイル・システムから顧客データをテキスト・ファイルとして受信します。ReadFileアダプタ・サービスから、ReadFile_RSというルーティング・サービスにメッセージが送信されます。ReadFile_RSからアウトバウンド・アダプタ・サービスWriteFTPにメッセージが送信されます。WriteFTPサービスにより、メッセージが関連外部アプリケーションに配信されます。

この項には次のトピックが含まれます:

5.5.3.1 前提条件

この例は、基本的なメディエータ・コンストラクト(サービスやルーティング・サービスなど)と、メディエータ・サービスを作成およびデプロイするJDeveloper環境を十分に理解していることを前提としています。

メディエータのフラット構造のビジネス・プロセスを実行するには、まず次のファイルを作成する必要があります:

  • address-csv.xsd

address-csv.xsdの内容

<?xml version="1.0" ?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
            targetNamespace="http://xmlns.oracle.com/pcbpel/demoSchema/csv"
            xmlns:tns="http://xmlns.oracle.com/pcbpel/demoSchema/csv"
            elementFormDefault="qualified"
            attributeFormDefault="unqualified" nxsd:encoding="US-ASCII" nxsd:hasHeader="true" nxsd:headerLines="1" nxsd:linesTerminatedBy="${eol}" nxsd:stream="chars" nxsd:version="NXSD">
  <xsd:element name="Root-Element">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="Address" minOccurs="1" maxOccurs="unbounded">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="Name" type="xsd:string" nxsd:style="terminated" nxsd:terminatedBy="," nxsd:quotedBy="&quot;">
              </xsd:element>
              <xsd:element name="Street1" type="xsd:string" nxsd:style="terminated" nxsd:terminatedBy="," nxsd:quotedBy="&quot;">
              </xsd:element>
              <xsd:element name="Street2" type="xsd:string" nxsd:style="terminated" nxsd:terminatedBy="," nxsd:quotedBy="&quot;">
              </xsd:element>
              <xsd:element name="City" type="xsd:string" nxsd:style="terminated" nxsd:terminatedBy="," nxsd:quotedBy="&quot;">
              </xsd:element>
              <xsd:element name="State" type="xsd:string" nxsd:style="terminated" nxsd:terminatedBy="," nxsd:quotedBy="&quot;">
              </xsd:element>
              <xsd:element name="Country" type="xsd:string" nxsd:style="terminated" nxsd:terminatedBy="${eol}" nxsd:quotedBy="&quot;">
              </xsd:element>
            </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>
<!--NXSDWIZ:D:\work\jDevProjects\BPEL\FlatStructure\address-csv.txt:-->
5.5.3.2 メディエータ・アプリケーションとプロジェクトの作成

使用例のアプリケーションとプロジェクトを作成するには、次のステップを実行します。

  1. JDeveloper「アプリケーション・ナビゲータ」で、「新規アプリケーション」をクリックします。「汎用アプリケーションの作成 - アプリケーションの名前付け」ページが表示されます。
  2. 「アプリケーション名」フィールドにFileFTP_RWと入力して「次へ」をクリックします。「汎用アプリケーションの作成 - プロジェクトの名前付け」ページが表示されます。
  3. 「プロジェクト名」フィールドにFileRead_FTPWriteと入力します。
  4. 「プロジェクト・テクノロジ」タブの「選択可能」リストで「SOA」をダブルクリックし、「選択済」リストに移動します。
  5. 「次へ」をクリックします。「汎用アプリケーションの作成 - SOA設定の設定」ページが表示されます。
  6. 「コンポジット・テンプレート」ボックスで「メディエータを使用するコンポジット」を選択します。
  7. 「終了」をクリックします。「メディエータの作成 - メディエータ・コンポーネント」ページが表示されます。
  8. 「名前」フィールドにFileRead_RSと入力します。
  9. 「テンプレート」リストで「インタフェースを後で定義」を選択し、「OK」をクリックします。FileFTP_RWアプリケーションとFileRead_FTPWriteプロジェクトが設計領域に表示されます。
5.5.3.3 スキーマ定義(.XSD)ファイルのインポート

メッセージの構造を定義するXSDファイルをインポートするには、次のステップを実行します。

  1. Schemaディレクトリを作成し、作成したaddress-csv.xsdファイル(「前提条件」を参照)をこのディレクトリにコピーします。

  2. 「アプリケーション・ナビゲータ」「FileRead_FTPWrite」を選択します。

  3. 「ファイル」メニューから「インポート」を選択します。「インポート」ダイアログが表示されます。

  4. 「インポートするものを選択」リストから「Webソース」を選択して「OK」をクリックします。「Webソース」ダイアログが表示されます。

  5. 「コピー元」フィールドの右側にある「参照」をクリックします。「ディレクトリの選択」ダイアログが表示されます。

  6. 「スキーマ」ディレクトリにナビゲートして「選択」をクリックします。ディレクトリが選択された状態で「Webソース」ダイアログが表示されます。

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

5.5.3.4 インバウンドOracleファイル・アダプタ・サービスの作成

ローカル・ディレクトリからファイルを読み取るインバウンドのOracleファイル・アダプタ・サービスを作成するには、次のステップを実行します

  1. 「コンポーネント」ウィンドウから設計領域にファイル・アダプタをドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
  2. 「サービス名」フィールドにReadFileと入力して「次へ」をクリックします。
  3. 「アダプタ・インタフェース」画面で「操作およびスキーマから定義(後で指定)」を選択し、「次へ」をクリックします。
  4. 「FTPサーバー接続」画面で「FTPサーバーのJNDI名」に入力し、「次へ」をクリックします。
  5. 「操作」画面で「ファイルの読取り」を選択し、「次へ」をクリックします。
  6. 「ファイル・ディレクトリ」画面で、「物理パス」オプションを選択し、「参照」をクリックして、ポーリング・ディレクトリを選択し、「次へ」をクリックします。
  7. 「ファイルのフィルタ処理」画面で、「インクルード・ファイルの名前パターン」フィールドに*.txtと入力し、「次へ」をクリックします。
  8. 「ファイル・ポーリング」ページで「次へ」をクリックします。
  9. 「メッセージ」画面で、次を行います:
    1. 「URL」フィールドの端にある「スキーマ・ファイルを参照」ボタンをクリックします。
      「タイプ・チューザ」ダイアログが表示されます。
    2. 「プロジェクトのスキーマ・ファイル」「address-csv.xsd」および「Root-Element」を順番に選択します。
    3. 「OK」をクリックします。
    4. 「次へ」をクリックします。
  10. 「JCAエンドポイント・プロパティ」画面で、「次へ」をクリックします。
    参照構成オプションを選択した場合、「JCAエンドポイント・プロパティ」画面が表示されます。詳細は、「アダプタ構成ウィザードのJCAエンドポイント・プロパティ」を参照してください。
  11. 「終了」をクリックします。ReadFileアダプタ・サービスが作成されます。
5.5.3.5 アウトバウンドのOracle FTPアダプタ・サービスの作成

ファイルをFTPサーバーに書き込むアウトバウンドのOracle FTPアダプタ・サービスを作成するには、次のステップを実行します。

  1. 「コンポーネント」から設計領域にFTPアダプタ・サービスをドラッグします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
  2. 「サービス名」フィールドにWriteFTPと入力します。
  3. 「次へ」をクリックします。「アダプタ・インタフェース」ページが表示されます。
  4. 「操作およびスキーマから定義(後で指定)」を選択して「次へ」をクリックします。「FTPサーバー接続」ページが表示されます。
  5. 「FTPサーバーのJNDI名」フィールドでFTPサーバーのJNDI名を指定して「次へ」をクリックします。「操作」ページが表示されます。
  6. ファイル・タイプとして「ASCII」オプションを選択します。
  7. 操作タイプとして「Put File」オプションを選択して「次へ」をクリックします。「ファイル構成」ページが表示されます。
  8. 「発信ファイルのディレクトリ(物理パス)」フィールドで、ファイルの書込み先ディレクトリを指定します。
  9. ファイル・ネーミング規則フィールドで、出力ファイル名のネーミング規則を指定します。たとえば、po_%SEQ%.txtを指定します。
  10. 「次へ」をクリックします。「メッセージ」ページが表示されます。
  11. 「URL」フィールドの端にある「スキーマ・ファイルを参照」ボタンをクリックします。「タイプ・チューザ」ダイアログが表示されます。
  12. 「プロジェクトのスキーマ・ファイル」「address-csv.xsd」および「Root-Element」を順番に選択します。
  13. 「OK」をクリックします。
  14. 「メッセージ」ページで「次へ」をクリックします。「終了」ページが表示されます。
  15. 「JCAエンドポイント・プロパティ」画面で、「次へ」をクリックします。
    参照構成オプションを選択した場合、「JCAエンドポイント・プロパティ」画面が表示されます。詳細は、「アダプタ構成ウィザードのJCAエンドポイント・プロパティ」を参照してください。
  16. 「終了」をクリックします。WriteFTPアダプタ・サービスが作成されます。
5.5.3.6 サービスのワイヤリング

作成した3つのコンポーネント(インバウンドOracleファイル・アダプタ・サービス、メディエータ・コンポーネント、アウトバウンドOracle FTPアダプタ参照)をアセンブルまたは接続する必要があります。コンポーネントを接続するステップは、次のとおりです。

  1. 「公開されたサービス」領域にあるReadFile内の小さい三角形を、「コンポーネント」領域のメディエータ・コンポーネント内に緑の三角形として表示されるドロップ・ゾーンにドラッグします。
  2. 「コンポーネント」領域にあるメディエータ・コンポーネント内の小さい三角形を、「外部参照」領域のWriteFTP内に緑の三角形として表示されるドロップ・ゾーンにドラッグします。図5-94のように、JDevelopercomposite.xmlが表示されます。

    図5-94 JDeveloper - composite.xml

    図5-94の説明が続きます
    「図5-94 JDeveloper - composite.xml」の説明
5.5.3.7 ルーティング・ルールの作成

ルーティング・サービスを作成するには、次のステップを実行します。

  1. 「ReadFile_RS」ルーティング・サービスをダブルクリックします。図5-95に示すように、「操作」ペインに「Read」操作が表示されます。

    図5-95 JDeveloper - ReadFile_RSルーティング・サービスのページ

    図5-95の説明が続きます
    「図5-95 JDeveloper - ReadFile_RSルーティング・サービスのページ」の説明
  2. 「<<フィルタ式>>」の左にある「+」記号をクリックし、ルーティング・ルールを開きます。
  3. 「次を使用して変換」フィールドの端に表示されるアイコンをクリックします。図5-96に示すように、「リクエスト・トランスフォーメーション・マップ」ダイアログが表示されます。

    図5-96 「リクエスト・トランスフォーメーション・マップ」ダイアログ

    図5-96の説明が続きます
    「図5-96 「リクエスト・トランスフォーメーション・マップ」ダイアログ」の説明
  4. 「新規マッパー・ファイルの作成」を選択し、「OK」をクリックします。

    JDeveloper「Root-Element_To_Root-Element.xsl」タブが追加されます。このタブを使用すると、ファイル・データ構造を正規のデータ構造に変換するためのドキュメント・トランスフォーメーション・ファイルをグラフィカルに作成できます。

  5. 「imp1:Address」ソース要素を「imp1:Address」ターゲット要素にドラッグ・アンド・ドロップします。「自動マップ・プリファレンス」ダイアログが表示されます。
  6. 「自動マップ中」オプションから、「祖先名を考慮した要素の一致」の選択を解除します。
  7. 「OK」をクリックします。
  8. 「ファイル」メニューから「保存」をクリックします。
5.5.3.8 JDeveloperを使用したデプロイ

前述のステップで作成したSOAプロジェクトおよびアプリケーションについて、アプリケーション・プロファイルをデプロイする必要があります。JDeveloperを使用してアプリケーション・プロファイルをデプロイするには、次のステップを実行する必要があります。

  1. アプリケーション・サーバー接続を作成します。詳細は、「Oracle JCAアダプタ用のアプリケーション・サーバー接続の作成」を参照してください。
  2. アプリケーションをデプロイします。詳細は、「JDeveloperからのOracle JCAアダプタ・アプリケーションのデプロイ」を参照してください。
5.5.3.9 実行時タスク

実行時に、テキスト・ファイルをポーリング・ディレクトリにコピーします。Oracleファイル・アダプタによりファイルが取得されると、設計時に指定したディレクトリに書き込まれます。

5.5.4 Oracleファイル・アダプタのスケーラブルなDOM

この使用例では、スケーラブルなDOMプロセスでストリーミング機能を使用して、大型ファイルをディレクトリ間でコピーまたは移動する方法を説明します。

ストリーミング・オプションは、DB2のハイドレーション・ストアではサポートされません。

この項には次のトピックが含まれます:

5.5.4.1 前提条件

大きなペイロードのストリーミングのプロセスを実行するには、まず次のファイルを作成する必要があります:

  • address-csv.xsd

  • address-csv-large.txt

address-csv.xsdの内容

<?xml version="1.0" ?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
            targetNamespace="http://xmlns.oracle.com/pcbpel/demoSchema/csv"
            xmlns:tns="http://xmlns.oracle.com/pcbpel/demoSchema/csv"
            elementFormDefault="qualified"
            attributeFormDefault="unqualified" nxsd:encoding="US-ASCII" nxsd:hasHeader="true" nxsd:headerLines="1" nxsd:linesTerminatedBy="${eol}" nxsd:stream="chars" nxsd:version="NXSD">
  <xsd:element name="Root-Element">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="Address" minOccurs="1" maxOccurs="unbounded">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="Name" type="xsd:string" nxsd:style="terminated" nxsd:terminatedBy="," nxsd:quotedBy="&quot;">
              </xsd:element>
              <xsd:element name="Street1" type="xsd:string" nxsd:style="terminated" nxsd:terminatedBy="," nxsd:quotedBy="&quot;">
              </xsd:element>
              <xsd:element name="Street2" type="xsd:string" nxsd:style="terminated" nxsd:terminatedBy="," nxsd:quotedBy="&quot;">
              </xsd:element>
              <xsd:element name="City" type="xsd:string" nxsd:style="terminated" nxsd:terminatedBy="," nxsd:quotedBy="&quot;">
              </xsd:element>
              <xsd:element name="State" type="xsd:string" nxsd:style="terminated" nxsd:terminatedBy="," nxsd:quotedBy="&quot;">
              </xsd:element>
              <xsd:element name="Country" type="xsd:string" nxsd:style="terminated" nxsd:terminatedBy="${eol}" nxsd:quotedBy="&quot;">
              </xsd:element>
            </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>
<!--NXSDWIZ:D:\work\jDevProjects\BPEL\FlatStructure\address-csv.txt:-->

address-csv-large.txtの内容

Name,Street1,Street2,City,State,Country
Oracle India Private Limited, Lexington Towers Prestige St. John's Woods, 2nd Cross Road Chikka Audugodi, Bangalore, Karnataka, India
Intel Technology India Private Limited, Survey #23-56 P Devarabeesanahalli Village, Outer Ring Road Varthur Hobli, Bangalore, Karnataka, India
<<copy the 2 lines above 100 times>>
5.5.4.2 SOAコンポジットの設計

SOAコンポジットを含んだJDeveloperアプリケーションを作成する必要があります。使用例のアプリケーションとプロジェクトを作成するステップは、次のとおりです。

  1. JDeveloper「アプリケーション・ナビゲータ」で、「新規アプリケーション」をクリックします。「汎用アプリケーションの作成 - アプリケーションの名前付け」ページが表示されます。
  2. 「アプリケーション名」フィールドにSOA-ScalableDOMと入力して「次へ」をクリックします。「汎用アプリケーションの作成 - プロジェクトの名前付け」ページが表示されます。
  3. 「プロジェクト名」フィールドにScalableDOMと入力します。
  4. 「プロジェクト・テクノロジ」タブの「選択可能」リストで「SOA」をダブルクリックし、「選択済」リストに移動します。
  5. 「次へ」をクリックします。「SOA設定の構成」ダイアログが表示されます。
  6. 「コンポジット・テンプレート」ボックスで「BPELを使用するコンポジット」を選択して「終了」をクリックします。SOA-ScalableDOMアプリケーションとScalableDOMプロジェクトが「アプリケーション・ナビゲータ」に表示され、「BPELプロセスの作成 - BPELプロセス」ページが表示されます。
  7. 「名前」フィールドにBPELScalableDOMと入力し、「テンプレート」ボックスから「サービスを後で定義」を選択します。
  8. 「OK」をクリックします。SOA-ScalableDOMアプリケーションとScalableDOMプロジェクトが設計領域に表示されます。
  9. 作成したaddress-csv.xsdファイル(「前提条件」を参照)をプロジェクトのxsdディレクトリにコピーします。
5.5.4.3 インバウンドOracleファイル・アダプタ・サービスの作成

ローカル・ディレクトリからファイルを読み取るインバウンドのOracleファイル・アダプタ・サービスを作成するには、次のステップを実行します。

  1. 「コンポーネント」ウィンドウから「公開されたサービス」スイムレーンにファイル・アダプタをドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
  2. 「サービス名」フィールドにScalableDOMInと入力します。
  3. 「次へ」をクリックします。「アダプタ・インタフェース」ページが表示されます。
  4. 「操作およびスキーマから定義(後で指定)」を選択して「次へ」をクリックします。「FTPサーバー接続」 ページが表示されます。
  5. 「FTPサーバー接続」画面で「FTPサーバーのJNDI名」に入力し、「次へ」をクリックします。
  6. 「Read File」を選択し、「ファイル・ストリーミングを使用します」を選択して「次へ」をクリックします。「ファイル・ディレクトリ」ページが表示されます。
  7. 入力ディレクトリの物理パスを入力します。「ファイルのフィルタ処理」ページが表示されます。
  8. 「インクルード・ファイルの名前パターン」フィールドに*.txtと入力して「次へ」をクリックします。「ファイル・ポーリング」ページが表示されます。
  9. 「次へ」をクリックします。「メッセージ」ページが表示されます。
  10. 「URL」フィールドの後に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
  11. 図5-97に示すように、「プロジェクトのスキーマ・ファイル」「address-csv.xsd」および「Root-Element」を順番にクリックします。

    図5-97 「タイプ・チューザ」ダイアログ

    図5-97の説明が続きます
    「図5-97 「タイプ・チューザ」ダイアログ」の説明
  12. 「OK」をクリックします。「メッセージ」ページの「URL」フィールドにaddress-csv.xsdファイルが移入されます。
  13. 「次」をクリックします。
  14. 「JCAエンドポイント・プロパティ」画面で、「次へ」をクリックします。
    参照構成オプションを選択した場合、「JCAエンドポイント・プロパティ」画面が表示されます。詳細は、「アダプタ構成ウィザードのJCAエンドポイント・プロパティ」を参照してください。
  15. 「終了」をクリックします。インバウンドのOracleファイル・アダプタが構成され、composite.xmlが表示されます。

    図5-98 JDeveloper - composite.xml

    図5-98の説明が続きます
    「図5-98 JDeveloper - composite.xml」の説明
5.5.4.4 アウトバウンドOracleファイル・アダプタ・サービスの作成

ローカル・ディレクトリからFTPサーバーにファイルを書き込むアウトバウンドのOracleファイル・アダプタ・サービスを作成するには、次のステップを実行します。

  1. 「コンポーネント」ウィンドウから「外部参照」スイムレーンにファイル・アダプタをドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
  2. 「サービス名」フィールドにScalableDOMOutと入力します。
  3. 「次へ」をクリックします。「アダプタ・インタフェース」ページが表示されます。
  4. 「操作およびスキーマから定義(後で指定)」を選択して「次へ」をクリックします。「FTPサーバー接続」 ページが表示されます。
  5. 「FTPサーバー接続」画面で「FTPサーバーのJNDI名」に入力し、「次へ」をクリックします。
  6. 「Write File」を選択して「次へ」をクリックします。「ファイル構成」ページが表示されます。
  7. 出力ディレクトリの物理パスを入力し、address-csv_%SEQ%.xml「ファイル・ネーミング規則(po_%SEQ%.txt)」フィールドに入力します。
  8. 「次へ」をクリックします。「メッセージ」ページが表示されます。
  9. 「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
  10. 「プロジェクトのスキーマ・ファイル」「address-csv.xsd」および「Root-Element」を順番にクリックします。
  11. 「OK」をクリックします。「メッセージ」ページの「URL」フィールドにaddress-csv.xsdファイルが移入されます。
  12. 「次」をクリックします。
  13. 「JCAエンドポイント・プロパティ」画面で、「次へ」をクリックします。
    参照構成オプションを選択した場合、「JCAエンドポイント・プロパティ」画面が表示されます。詳細は、「アダプタ構成ウィザードのJCAエンドポイント・プロパティ」を参照してください。
  14. 「終了」をクリックします。図5-99に示すように、アウトバウンドOracleファイル・アダプタが構成され、composite.xmlが表示されます。

    図5-99 JDeveloper - composite.xml

    図5-99の説明が続きます
    「図5-99 JDeveloper - composite.xml」の説明
5.5.4.5 サービスとアクティビティのワイヤリング

作成した3つのコンポーネント(インバウンド・アダプタ・サービス、BPELプロセス、アウトバウンド・アダプタ参照)をアセンブルまたは接続する必要があります。コンポーネントを接続するステップは、次のとおりです。

  1. 「公開されたサービス」領域にあるScalableDOMIn内の小さい三角形を、「コンポーネント」領域のBPELプロセス内に緑の三角形として表示されるドロップ・ゾーンにドラッグします。
  2. 「コンポーネント」領域にあるBPELプロセス内の小さい三角形を、「外部参照」領域のScalableDOMOut内に緑の三角形として表示されるドロップ・ゾーンにドラッグします。

    JDevelopercomposite.xml図5-100のように表示されます。

    図5-100 JDeveloper - composite.xml

    図5-100の説明が続きます
    「図5-100 JDeveloper - composite.xml」の説明
  3. 「ファイル」「すべて保存」を順番にクリックします。
5.5.4.5.1 receiveアクティビティの追加
  1. 「BPELScalableDOM」をダブルクリックします。「BPELScalableDOM.bpel」ページが表示されます。
  2. 「コンポーネント」ウィンドウから設計領域にreceiveアクティビティをドラッグ・アンド・ドロップします。
  3. receiveアクティビティをダブルクリックします。「Receive」ダイアログが表示されます。
  4. 「名前」フィールドにReceiveFileと入力します。
  5. 「パートナ・リンク」フィールドの端にある「パートナ・リンクの参照」をクリックします。「パートナ・リンク・チューザ」ダイアログが表示されます。
  6. 図5-101に示すように、「ScalableDOMIn」を選択して「OK」をクリックします。

    図5-101 「パートナ・リンク・チューザ」ダイアログ

    図5-101の説明が続きます
    「図5-101 「パートナ・リンク・チューザ」ダイアログ」の説明
  7. 「Receive」ダイアログで、「変数」フィールドの右にある「変数の自動作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。
  8. デフォルトの変数名を選択し、「OK」をクリックします。デフォルトの変数名が「変数」フィールドに移入されます。
  9. 「インスタンスの作成」を選択して、「OK」をクリックします。JDeveloper「composite.xml」ページが図5-102のように表示されます。

    図5-102 JDeveloper - BPELScalableDOM.bpel

    図5-102の説明が続きます
    「図5-102 JDeveloper - BPELScalableDOM.bpel」の説明
5.5.4.5.2 invokeアクティビティの追加
  1. 「コンポーネント」ウィンドウから設計領域にinvokeアクティビティをドラッグ・アンド・ドロップします。
  2. invokeアクティビティをダブルクリックします。Invokeダイアログが表示されます。
  3. 「名前」フィールドにWriteFileと入力します。
  4. 「パートナ・リンク」フィールドの端にある「パートナ・リンクの参照」をクリックします。「パートナ・リンク・チューザ」ダイアログが表示されます。
  5. 「ScalableDOMOut」を選択して「OK」をクリックします。
  6. 「Invoke」ダイアログで、「入力変数」フィールドの右にある「入力変数の自動作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。
  7. デフォルトの変数名を選択し、「OK」をクリックします。「入力変数」フィールドにデフォルトの変数名が移入されます。Invokeダイアログが表示されます。
  8. 「OK」をクリックします。図5-103に示すように、JDeveloperの「BPELScalableDOM.bpel」ページが表示されます。

    図5-103 JDeveloper - 「BPELScalableDOM.bpel」ページ

    図5-103の説明が続きます
    「図5-103 JDeveloper - 「BPELScalableDOM.bpel」ページ」の説明
5.5.4.5.3 assignアクティビティの追加
  1. 「コンポーネント」ウィンドウから設計領域のreceiveアクティビティとinvokeアクティビティの間にassignアクティビティをドラッグ・アンド・ドロップします。
  2. assignアクティビティをダブルクリックします。Assignダイアログが表示されます。
  3. 「名前」フィールドにAssignPayloadと入力します。
  4. 「コピー操作」タブをクリックします。図5-104に示すように、Assignダイアログが表示されます。

    図5-104 「Assign」ダイアログ - 「コピー操作」タブ

    図5-104の説明が続きます
    「図5-104 「Assign」ダイアログ - 「コピー操作」タブ」の説明
  5. 「コピー操作」を選択します。「コピー操作の作成」ダイアログが表示されます。
  6. 図5-105に示すように、「From」および「To」ペインで「変数」を開きます。

    図5-105 「コピー操作の作成」ダイアログ

    図5-105の説明が続きます
    「図5-105 「コピー操作の作成」ダイアログ」の説明
  7. 「OK」をクリックします。図5-106に示すように、Assignダイアログが表示されます。

    図5-106 「Assign」ダイアログ

    図5-106の説明が続きます
    「図5-106 「Assign」ダイアログ」の説明
  8. 「OK」をクリックします。図5-107に示すように、JDeveloperの「BPELScalableDOM.bpel」ページが表示されます。

    図5-107 JDeveloper - BPELScalableDOM.bpel

    図5-107の説明が続きます
    「図5-107 JDeveloper - BPELScalableDOM.bpel」の説明
  9. 「ファイル」「すべて保存」を順番にクリックします。
5.5.4.6 JDeveloperを使用したデプロイ

前述のステップで作成したSOAプロジェクトおよびアプリケーションについて、アプリケーション・プロファイルをデプロイする必要があります。JDeveloperを使用してアプリケーション・プロファイルをデプロイするには、次のステップを実行する必要があります。

  1. アプリケーション・サーバー接続を作成します。詳細は、「Oracle JCAアダプタ用のアプリケーション・サーバー接続の作成」を参照してください。
  2. アプリケーションをデプロイします。詳細は、「JDeveloperからのOracle JCAアダプタ・アプリケーションのデプロイ」を参照してください。
5.5.4.7 Oracle Fusion Middleware Controlコンソールを使用した監視

Fusion Middleware Controlコンソールを使用して、デプロイ済のSOAコンポジットを監視できます。次のステップを実行します。

  1. http://servername:portnumber/emにナビゲートします。デプロイしたコンポジットがアプリケーション・ナビゲータに表示されます。
  2. 作成したaddress-csv-large.txtファイル(「前提条件」を参照)を入力ディレクトリにコピーし、処理済であることを確認します。出力ディレクトリを調べて、出力ファイルが作成されていることを確認します。
  3. デプロイしたSOAコンポジットをクリックします。「ダッシュボード」が表示されます。

    「最新のインスタンス」領域で「インスタンスID」の値をノートにとります。

  4. 「インスタンス」タブをクリックします。SOAコンポジットのインスタンスIDがリスト表示されます。
  5. ステップ3でメモしたインスタンスIDをクリックします。「フローのトレース」ページが表示されます。
  6. BPELプロセス・インスタンスをクリックします。BPELプロセス・インスタンスの「監査証跡」が表示されます。
  7. ペイロード・ノードを開いてペイロード詳細を確認します。
  8. プロセス・フローを表示するには、「フロー」タブをクリックします。アクティビティをクリックして、アクティビティの詳細を表示します。

5.5.5 Oracleファイル・アダプタのチャンク読取り

チャンク読取りは、whileループ内でinvokeアクティビティを使用してターゲット・ファイルを処理するOracleファイル・アダプタ機能です。この機能を使用すると、大きいファイルを適宜処理できます。

この項には次のトピックが含まれます:

5.5.5.1 前提条件

Oracleファイル・アダプタのChunkRead操作を実行するには、まず次のファイルを作成する必要があります:

  • address-csv.xsd

  • address-fixedLength.xsd

  • addr1Toaddr2.xsl

  • address-csv.txt

address-csv.xsdの内容

<?xml version="1.0" ?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
            targetNamespace="http://xmlns.oracle.com/pcbpel/demoSchema/csv"
            xmlns:tns="http://xmlns.oracle.com/pcbpel/demoSchema/csv"
            elementFormDefault="qualified"
            attributeFormDefault="unqualified" nxsd:encoding="US-ASCII" nxsd:hasHeader="true" nxsd:headerLines="1" nxsd:linesTerminatedBy="${eol}" nxsd:stream="chars" nxsd:version="NXSD">
  <xsd:element name="Root-Element">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="Address" minOccurs="1" maxOccurs="unbounded">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="Name" type="xsd:string" nxsd:style="terminated" nxsd:terminatedBy="," nxsd:quotedBy="&quot;">
              </xsd:element>
              <xsd:element name="Street1" type="xsd:string" nxsd:style="terminated" nxsd:terminatedBy="," nxsd:quotedBy="&quot;">
              </xsd:element>
              <xsd:element name="Street2" type="xsd:string" nxsd:style="terminated" nxsd:terminatedBy="," nxsd:quotedBy="&quot;">
              </xsd:element>
              <xsd:element name="City" type="xsd:string" nxsd:style="terminated" nxsd:terminatedBy="," nxsd:quotedBy="&quot;">
              </xsd:element>
              <xsd:element name="State" type="xsd:string" nxsd:style="terminated" nxsd:terminatedBy="," nxsd:quotedBy="&quot;">
              </xsd:element>
              <xsd:element name="Country" type="xsd:string" nxsd:style="terminated" nxsd:terminatedBy="${eol}" nxsd:quotedBy="&quot;">
              </xsd:element>
            </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>
<!--NXSDWIZ:D:\work\jDevProjects\BPEL\FlatStructure\address-csv.txt:-->

address-fixedLength.xsdの内容

<?xml version="1.0" ?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
            targetNamespace="http://xmlns.oracle.com/pcbpel/demoSchema/fixedLength"
            xmlns:fix="http://xmlns.oracle.com/pcbpel/demoSchema/fixedLength"
            elementFormDefault="qualified"
            attributeFormDefault="unqualified" nxsd:encoding="US-ASCII" nxsd:stream="chars" nxsd:version="NXSD">
  <xsd:element name="Root-Element">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="Address" minOccurs="1" maxOccurs="unbounded" nxsd:style="array" nxsd:cellSeparatedBy="\r\n">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="Name" type="xsd:string" nxsd:style="fixedLength" nxsd:length="38">
              </xsd:element>
              <xsd:element name="Street" type="xsd:string" nxsd:style="fixedLength" nxsd:length="80">
              </xsd:element>
              <xsd:element name="City" type="xsd:string" nxsd:style="fixedLength" nxsd:length="11">
              </xsd:element>
              <xsd:element name="State" type="xsd:string" nxsd:style="fixedLength" nxsd:length="11">
              </xsd:element>
              <xsd:element name="Country" type="xsd:string" nxsd:style="fixedLength" nxsd:length="7">
              </xsd:element>
            </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>
<!--NXSDWIZ:C:\orabpel\samples\tutorials\121.FileAdapter\FlatStructure\outputDir\csv_2004.11.10.txt:-->

addr1Toaddr2.xslの内容

<?xml version="1.0" encoding="windows-1252"?>
<?oracle-xsl-mapper
  <!-- SPECIFICATION OF MAP SOURCES AND TARGETS, DO NOT MODIFY. -->
  <mapSources>
    <source type="XSD">
      <schema location="xsd/address-csv.xsd"/>
      <rootElement name="Root-Element" namespace="http://xmlns.oracle.com/pcbpel/demoSchema/csv"/>
    </source>
  </mapSources>
  <mapTargets>
    <target type="XSD">
      <schema location="xsd/address-fixedLength.xsd"/>
      <rootElement name="Root-Element" namespace="http://xmlns.oracle.com/pcbpel/demoSchema/fixedLength"/>
    </target>
  </mapTargets>
  <!-- GENERATED BY ORACLE XSL MAPPER 1.0 AT [TUE NOV 16 16:14:01 IST 2004]. -->
?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                xmlns:tns="http://xmlns.oracle.com/pcbpel/demoSchema/csv"
                xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
                xmlns:fix="http://xmlns.oracle.com/pcbpel/demoSchema/fixedLength"
                exclude-result-prefixes="xsl xsd tns nxsd fix">
  <xsl:template match="/">
    <fix:Root-Element>
      <xsl:for-each select="/tns:Root-Element/tns:Address">
        <fix:Address>
          <fix:Name>
            <xsl:value-of select="tns:Name"/>
          </fix:Name>
          <fix:Street>
            <xsl:value-of select="concat(tns:Street1,tns:Street2)"/>
          </fix:Street>
          <fix:City>
            <xsl:value-of select="tns:City"/>
          </fix:City>
          <fix:State>
            <xsl:value-of select="tns:State"/>
          </fix:State>
          <fix:Country>
            <xsl:value-of select="tns:Country"/>
          </fix:Country>
        </fix:Address>
      </xsl:for-each>
    </fix:Root-Element>
  </xsl:template>
</xsl:stylesheet>

address-csv.txtの内容

Name,Street1,Street2,City,State,Country
Oracle India Private Limited, Lexington Towers Prestige St. John's Woods, 2nd Cross Road Chikka Audugodi, Bangalore, Karnataka, India
Intel Technology India Private Limited, Survey #23-56 P Devarabeesanahalli Village, Outer Ring Road Varthur Hobli, Bangalore, Karnataka, India
5.5.5.2 SOAコンポジットの設計

SOAコンポジット・アプリケーションを含んだJDeveloperアプリケーションを作成する必要があります。使用例のアプリケーションとプロジェクトを作成するステップは、次のとおりです。

  1. JDeveloper「アプリケーション・ナビゲータ」で、「新規アプリケーション」をクリックします。「汎用アプリケーションの作成 - アプリケーションの名前付け」ページが表示されます。
  2. 「アプリケーション名」フィールドにSOA-ChunkedReadと入力して「次へ」をクリックします。「汎用アプリケーションの作成 - プロジェクトの名前付け」ページが表示されます。
  3. 「プロジェクト名」フィールドにChunkedReadと入力します。
  4. 「プロジェクト・テクノロジ」タブの「選択可能」リストで「SOA」をダブルクリックし、「選択済」リストに移動します。
  5. 「次へ」をクリックします。「SOA設定の構成」ダイアログが表示されます。
  6. 「コンポジット・テンプレート」ボックスで「BPELを使用するコンポジット」を選択して「終了」をクリックします。「BPELプロセスの作成 - BPELプロセス」ページが表示されます。
  7. 「名前」フィールドにBPELChunkedReadと入力し、「テンプレート」ボックスから「サービスを後で定義」を選択します。
  8. 「OK」をクリックします。図5-108に示すように、SOA-ChunkedReadアプリケーションとChunkedReadプロジェクトが設計領域に表示されます。

    図5-108 JDeveloper - composite.xml

    図5-108の説明が続きます
    「図5-108 JDeveloper - composite.xml」の説明
  9. 作成したaddress-csv.xsdおよびaddress-fixedLength.xsdファイル(「前提条件」を参照)をプロジェクトのxsdディレクトリにコピーします。
  10. 作成したaddr1Toaddr2.xsl (「前提条件」を参照)をプロジェクトのxslディレクトリにコピーします。
5.5.5.3 インバウンドOracleファイル・アダプタ・サービスの作成

ローカル・ディレクトリからファイルを読み取るインバウンドのOracleファイル・アダプタ・サービスを作成するには、次のステップを実行します。

  1. 「コンポーネント」ウィンドウから「公開されたサービス」スイムレーンにファイル・アダプタをドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
  2. 「サービス名」フィールドにFileInNoPayloadInと入力します。
  3. 「次へ」をクリックします。「アダプタ・インタフェース」ページが表示されます。
  4. 「操作およびスキーマから定義(後で指定)」を選択して「次へ」をクリックします。「FTPサーバー接続」 ページが表示されます。
  5. 「FTPサーバー接続」画面で「FTPサーバーのJNDI名」に入力し、「次へ」をクリックします。
  6. 「Read File」を選択し、「ファイルの内容を読み取らない」ボックスを選択して「次へ」をクリックします。「ファイル・ディレクトリ」ページが表示されます。
  7. 入力ディレクトリの物理パスを入力します。「ファイルを再帰的に処理します」を選択します。
  8. 「次へ」をクリックします。「ファイルのフィルタ処理」ページが表示されます。
  9. 「インクルード・ファイルの名前パターン」フィールドに*.txtと入力して「次へ」をクリックします。「ファイル・ポーリング」ページが表示されます。
  10. 「次」をクリックします。
  11. 「JCAエンドポイント・プロパティ」画面で、「次へ」をクリックします。
    参照構成オプションを選択した場合、「JCAエンドポイント・プロパティ」画面が表示されます。詳細は、「アダプタ構成ウィザードのJCAエンドポイント・プロパティ」を参照してください。
  12. 「終了」をクリックします。図5-109に示すように、インバウンドOracleファイル・アダプタが構成され、composite.xmlが表示されます。

    図5-109 JDeveloper - composite.xml

    図5-109の説明が続きます
    「図5-109 JDeveloper - composite.xml」の説明
5.5.5.4 アウトバウンドOracleファイル・アダプタ・サービスの作成

ローカル・ディレクトリからFTPサーバーにファイルを書き込むアウトバウンドのOracleファイル・アダプタ・サービスを作成するには、次のステップを実行します。

  1. 「コンポーネント」ウィンドウから「外部参照」スイムレーンにファイル・アダプタをドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
  2. 「サービス名」フィールドにReadAddressChunkと入力します。
  3. 「次へ」をクリックします。「アダプタ・インタフェース」ページが表示されます。
  4. 「操作およびスキーマから定義(後で指定)」を選択して「次へ」をクリックします。「FTPサーバー接続」が表示されます。
  5. 「FTPサーバー接続」画面で「FTPサーバーのJNDI名」に入力し、「次へ」をクリックします。
  6. 「同期Read File」を選択し、「操作名」フィールドにChunkedReadと入力して「次へ」をクリックします。「ファイル・ディレクトリ」ページが表示されます。
  7. 出力ディレクトリの物理パスを入力し、「正常な取得後にファイルを削除」を選択します。
  8. 「次へ」をクリックします。「ファイル名」ページが表示されます。
  9. 「ファイル名」フィールドにdummy.txtと入力します。
  10. 「次へ」をクリックします。「メッセージ」ページが表示されます。
  11. 「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
  12. 「プロジェクトのスキーマ・ファイル」「address-csv.xsd」および「Root-Element」を順番にクリックします。
  13. 「OK」をクリックします。「メッセージ」ページの「URL」フィールドにaddress-csv.xsdファイルが移入されます。
  14. 「次」をクリックします。
  15. 「JCAエンドポイント・プロパティ」画面で、「次へ」をクリックします。
    参照構成オプションを選択した場合、「JCAエンドポイント・プロパティ」画面が表示されます。詳細は、「アダプタ構成ウィザードのJCAエンドポイント・プロパティ」を参照してください。
  16. 「終了」をクリックします。アウトバウンドのOracleファイル・アダプタが構成され、composite.xmlが表示されます。

    図5-110 JDeveloper - composite.xml

    図5-110の説明が続きます
    「図5-110 JDeveloper - composite.xml」の説明
  17. メタデータを手動で編集して、チャンク読取り機能を組み込みます。

    ReadAddressChunk_file.jcaファイルを開き、メタデータを次の例のように変更します。

    例 - チャンク読取り機能を組み込むためのメタデータの変更

    <?xml version="1.0" encoding="UTF-8"?>
    <adapter-config name="ReadAddressChunk" 
                    adapter="File Adapter" 
    xmlns="http://platform.integration.oracle/blocks
                  /adapter/fw/metadata">
      <connection-factory location="eis/FileAdapter" 
                                adapterRef=""/>
      <endpoint-interaction portType="ChunkedRead_ptt" 
                        operation="ChunkedRead">
        <interaction-spec 
    className="oracle.tip.adapter.file.
                           outbound.ChunkedInteractionSpec">
          <property name="PhysicalDirectory" 
                               value="/tmp/chunked/in"/>
          <property name="FileName" value="dummy.txt"/>
          <property name="ChunkSize" value="1"/>
        </interaction-spec>
      </endpoint-interaction>
    </adapter-config>
    
  18. 「ファイル」「すべて保存」を順番にクリックします。
5.5.5.4.1 別のアウトバウンドOracleファイル・アダプタ・サービスの追加
  1. 「コンポーネント」ウィンドウから「外部参照」スイムレーンにファイル・アダプタをドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
  2. 「次へ」をクリックします。「サービス名」ページが表示されます。
  3. 「サービス名」フィールドにAppendChunkと入力します。
  4. 「次へ」をクリックします。「アダプタ・インタフェース」ページが表示されます。
  5. 「操作およびスキーマから定義(後で指定)」を選択して「次へ」をクリックします。「操作」ページが表示されます。
  6. 「Write File」を選択し、「操作名」フィールドにWriteと入力して「次へ」をクリックします。「ファイル構成」ページが表示されます。
  7. 出力ディレクトリの物理パスを入力し、「ファイル・ネーミング規則(po_%SEQ%.txt)」フィールドにdummy.txtと入力し、「既存のファイルに追加します」を選択します。
  8. 「次へ」をクリックします。「メッセージ」ページが表示されます。
  9. 「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
  10. 「プロジェクトのスキーマ・ファイル」「address-fixedLength.xsd」および「Root-Element」を順番にクリックします。
  11. 「OK」をクリックします。「メッセージ」ページの「URL」フィールドにaddress-fixedLength.xsdファイルが移入されます。
  12. 「次へ」をクリックします。「終了」ページが表示されます。
  13. 「終了」をクリックします。図5-111に示すように、アウトバウンドOracleファイル・アダプタが構成され、composite.xmlが表示されます。

    図5-111 JDeveloper - composite.xml

    図5-111の説明が続きます
    「図5-111 JDeveloper - composite.xml」の説明
5.5.5.5 サービスとアクティビティのワイヤリング

作成した3つのコンポーネント(インバウンド・アダプタ・サービス、BPELプロセス、2つのアウトバウンド・アダプタ参照)をアセンブルまたは接続する必要があります。コンポーネントを接続するステップは、次のとおりです。

  1. 「公開されたサービス」領域にあるFileInNoPayloadIn内の小さい三角形を、「コンポーネント」領域のBPELプロセス内に緑の三角形として表示されるドロップ・ゾーンにドラッグします。
  2. 「コンポーネント」領域にあるBPELプロセス内の小さい三角形を、「外部参照」領域のReadAddressChunk内に緑の三角形として表示されるドロップ・ゾーンと、「外部参照」領域のAppendChunk内の緑の三角形にドラッグします。

    JDevelopercomposite.xml図5-112のように表示されます。

    図5-112 JDeveloper - composite.xml

    図5-112の説明が続きます
    「図5-112 JDeveloper - composite.xml」の説明
  3. 「ファイル」「すべて保存」を順番にクリックします。
5.5.5.5.1 receiveアクティビティの追加
  1. 「BPELChunkedRead」をダブルクリックします。「BPELChunkedRead.bpel」ページが表示されます。
  2. (x)で表された「変数」アイコンをクリックします。「変数」ダイアログが表示されます。
  3. 「作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。
  4. 図5-113に示すように、次の変数を作成します(これらは後で使用します)。
     <variable name="dir" type="xsd:string"/>
        <variable name="file" type="xsd:string"/>
        <variable name="outIsEOF" type="xsd:string"/>
        <variable name="outLineNumber" type="xsd:string"/>
        <variable name="outColumnNumber" type="xsd:string"/>
        <variable name="returnIsEOF" type="xsd:string"/>
        <variable name="returnLineNumber" type="xsd:string"/>
        <variable name="returnColumnNumber" type="xsd:string"/>
        <variable name="returnIsMessageRejected"                                    type="xsd:string"/>
        <variable name="returnRejectionReason" type="xsd:string"/>
        <variable name="returnNoDataFound" type="xsd:string"/>
    

    図5-113 「変数」ダイアログ

    図5-113の説明が続きます
    「図5-113 「変数」ダイアログ」の説明

    ノート:

    すべての変数は、タイプxsd:stringの単純型です。

  5. 「コンポーネント」ウィンドウから設計領域にreceiveアクティビティをドラッグ・アンド・ドロップします。
  6. receiveアクティビティをダブルクリックします。「Receive」ダイアログが表示されます。
  7. 「名前」フィールドにReceiveFileDetailsと入力します。
  8. 「パートナ・リンク」フィールドの端にある「パートナ・リンクの参照」をクリックします。「パートナ・リンク・チューザ」ダイアログが表示されます。
  9. 「FileInNoPayloadIn」を選択して「OK」をクリックします。
  10. 「Receive」ダイアログで、「変数」フィールドの右にある「変数の自動作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。
  11. デフォルトの変数名を選択し、「OK」をクリックします。デフォルトの変数名が「変数」フィールドに移入されます。
  12. 「インスタンスの作成」を選択します。
  13. 「プロパティ」タブをクリックします。プロパティおよび対応する値の列が表示されます。
  14. jca.file.Directoryプロパティを選択します。対応する値の列をダブルクリックします。「アダプタ・プロパティ値」ダイアログが表示されます。
  15. 「変数の参照」アイコンをクリックします。「変数XPathビルダー」ダイアログが表示されます。
  16. 「変数」を開いて「dir」を選択し、「OK」をクリックします。jca.file.Directoryの値がdirに設定されます。
  17. jca.file.FileNameプロパティに対して同じ手順を繰り返し、値をfileに設定します。図5-114に示すように、「Receive」ダイアログが表示されます。

    図5-114 「Receive」ダイアログ - 「アダプタ」タブ

    「Receive」ダイアログ・ボックスを示す図
  18. 「OK」をクリックします。図5-115に示すように、JDeveloperの「BPELChunkedRead.bpel」ページが表示されます。

    図5-115 JDeveloper - BPELChunkedRead.bpel

    図5-115の説明が続きます
    「図5-115 JDeveloper - BPELChunkedRead.bpel」の説明
5.5.5.5.2 assignアクティビティの追加
  1. 「コンポーネント」ウィンドウから設計領域のreceiveアクティビティの後にassignアクティビティをドラッグ・アンド・ドロップします。
  2. assignアクティビティをダブルクリックします。Assignダイアログが表示されます。
  3. 「名前」フィールドにAssignChunkedReadと入力します。
  4. 「コピー操作」タブをクリックします。図5-104に示すように、Assignダイアログが表示されます。
  5. 「コピー操作」を選択します。「コピー操作の作成」ダイアログが表示されます。
  6. 図5-116に示すように、ヘッダーのデフォルト値を設定します。

    図5-116 「Assign」ダイアログ

    図5-116の説明が続きます
    「図5-116 「Assign」ダイアログ」の説明
  7. 「OK」をクリックします。図5-117に示すように、JDeveloperの「BPELChunkedRead.bpel」ページが表示されます。

    図5-117 JDeveloper - BPELChunkedRead.bpel

    図5-117の説明が続きます
    「図5-117 JDeveloper - BPELChunkedRead.bpel」の説明
  8. 「ファイル」「すべて保存」を順番にクリックします。
5.5.5.5.3 invokeアクティビティの追加
  1. 「コンポーネント」ウィンドウから設計領域のassignアクティビティの下にinvokeアクティビティをドラッグ・アンド・ドロップします。
  2. invokeアクティビティをダブルクリックします。「Invoke」ダイアログが表示されます。
  3. 「名前」フィールドにInvokeReadAddressと入力します。
  4. 「パートナ・リンク」フィールドの端にある「パートナ・リンクの参照」をクリックします。「パートナ・リンク・チューザ」ダイアログが表示されます。
  5. 「ReadAddressChunk」を選択して「OK」をクリックします。
  6. 「Invoke」ダイアログで、「入力変数」フィールドの右にある「入力変数の自動作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。
  7. デフォルトの変数名を選択し、「OK」をクリックします。デフォルトの変数名が「変数」フィールドに移入されます。入力変数が移入された状態で「Invoke」ダイアログが表示されます。
  8. 同じ手順を繰り返して出力変数を選択します。図5-118に示すように、Invokeダイアログが表示されます。

    図5-118 「Invoke」ダイアログ

    図5-118の説明が続きます
    「図5-118 「起動」ダイアログ」の説明
  9. 「OK」をクリックします。図5-119に示すように、JDeveloper「BPELChunkedRead.bpel」ページが表示されます。

    図5-119 JDeveloper - BPELChunkedRead.bpel

    図5-119の説明が続きます
    「図5-119 JDeveloper - BPELChunkedRead.bpel」の説明
  10. 「BPELChunkedRead.bpel」ページの「ソース」タブをクリックし、作成したinvokeアクティビティの次のプロパティを追加します。

    例 - invokeアクティビティに追加するプロパティ

    <bpelx:inputProperty name="jca.file.Directory" 
                     variable="dir"/>
    <bpelx:inputProperty name="jca.file.FileName" 
                       variable="file"/>
    <bpelx:inputProperty name="jca.file.LineNumber" 
                                     ="outLineNumber"/>
    <bpelx:inputProperty name="jca.file.ColumnNumber" 
    variable="outColumnNumber"/>
    <bpelx:inputProperty name="jca.file.IsEOF" 
                               variable="outIsEOF"/>
    <bpelx:outputProperty name="jca.file.LineNumber" 
    variable="returnLineNumber"/>
    <bpelx:outputProperty name="jca.file.ColumnNumber" 
    variable="returnColumnNumber"/>
    <bpelx:outputProperty name="jca.file.IsEOF" 
                       variable="returnIsEOF"/>
    <bpelx:outputProperty 
                   name="jca.file.IsMessageRejected" 
    variable="returnIsMessageRejected"/>
    <bpelx:outputProperty 
                  name="jca.file.RejectionReason" 
    variable="returnRejectionReason"/>
    <bpelx:outputProperty name="jca.file.NoDataFound" 
    variable="returnNoDataFound"/> 
    

    これは、BPEL 2.0の場合とは異なります。そのBPELバージョンでは、これは次の例のように表示されます。

    例 - BPEL 2.0を使用してinvokeに追加するプロパティ

    <bpelx:toProperties> 
    <bpelx:toProperty name="jca.file.Directory" variable="dir"/> 
    <bpelx:toProperty name="jca.file.FileName" variable="file"/> 
    <bpelx:toProperty name="jca.file.LineNumber" 
                        variable="outLineNumber"/> 
    <bpelx:toProperty name="jca.file.ColumnNumber" 
                    variable="outColumnNumber"/> 
    <bpelx:toProperty name="jca.file.IsEOF"
                   variable="outIsEOF"/> 
      </bpelx:toProperties> 
      <bpelx:fromProperties> 
    <bpelx:fromProperty name="jca.file.LineNumber" 
                      variable="returnLineNumber"/> 
    <bpelx:fromProperty name="jca.file.ColumnNumber" 
    variable="returnColumnNumber"/> 
    <bpelx:fromProperty name="jca.file.IsEOF" 
                      variable="returnIsEOF"/> 
    <bpelx:fromProperty 
                  name="jca.file.IsMessageRejected" 
    variable="returnIsMessageRejected"/> 
    <bpelx:fromProperty name="jca.file.RejectionReason" 
    variable="returnRejectionReason"/> 
    <bpelx:fromProperty 
                  name="jca.file.NoDataFound" 
    variable="returnNoDataFound"/> 
      </bpelx:fromProperties
    

    次の例のようにinvokeアクティビティが表示されます。

    例 - invokeアクティビティ

    <invoke name="InvokeReadAddress"
    inputVariable="InvokeReadAddress_SynchRead_InputVariable"
    outputVariable="InvokeReadAddress_SynchRead_OutputVariable"
    partnerLink="ReadAddressChunk" portType="ns3:SynchRead_ptt"
    operation="SynchRead">
    <bpelx:inputProperty name="jca.file.Directory" variable="dir"/>
    <bpelx:inputProperty name="jca.file.FileName" variable="file"/>
    <bpelx:inputProperty name="jca.file.LineNumber" 
                  variable="outLineNumber"/>
    <bpelx:inputProperty name="jca.file.ColumnNumber" 
    variable="outColumnNumber"/>
    <bpelx:inputProperty name="jca.file.IsEOF" 
                   variable="outIsEOF"/>
    <bpelx:outputProperty name="jca.file.LineNumber" 
    variable="returnLineNumber"/>
    <bpelx:outputProperty name="jca.file.ColumnNumber" 
    variable="returnColumnNumber"/>
    <bpelx:outputProperty name="jca.file.IsEOF" 
                       variable="returnIsEOF"/>
    <bpelx:outputProperty name="jca.file.IsMessageRejected" variable="returnIsMessageRejected"/>
    <bpelx:outputProperty name="jca.file.RejectionReason" 
    variable="returnRejectionReason"/>
    <bpelx:outputProperty name="jca.file.NoDataFound" 
    variable="returnNoDataFound"/>
    </invoke>
    
  11. 「assignアクティビティの追加」に示したように、CopyHeadersというassignアクティビティを追加し、invokeアクティビティからreturnパラメータをコピーします。図5-120に示すように、Assignダイアログが表示されます。

    図5-120 「Assign」ダイアログ

    図5-120の説明が続きます
    「図5-120 「Assign」ダイアログ」の説明
  12. 「OK」をクリックします。図5-121に示すように、JDeveloperの「BPELChunkedRead.bpel」ページが表示されます。

    図5-121 JDeveloper - BPELChunkedRead.bpel

    図5-121の説明が続きます
    「図5-121 JDeveloper - BPELChunkedRead.bpel」の説明
5.5.5.5.4 switchアクティビティの追加
  1. switchアクティビティを「CopyHeaders」assignアクティビティの下にドラッグ・アンド・ドロップします。
  2. switchアクティビティ内の「<case>」をダブルクリックします。「Switch Case」ダイアログが表示されます。
  3. 「名前」フィールドにDATA FOUNDと入力し、「式」ボックスで「returnNoDataFound」式を選択します。図5-122に示すように、「Switch Case」ダイアログが表示されます。

    図5-122 「Switch Case」ダイアログ

    図5-122の説明が続きます
    「図5-122 「Switch Case」ダイアログ」の説明
  4. invokeアクティビティをswitchアクティビティの「<Case DATA FOUND>」にドラッグ・アンド・ドロップします。
  5. invokeアクティビティをダブルクリックします。「Invoke」ダイアログが表示されます。
  6. 「名前」フィールドにInvokeAppendと入力します。
  7. 「パートナ・リンク」フィールドで「AppendChunk」を選択します。
  8. 「Invoke」ダイアログで、「入力変数」フィールドの右にある「入力変数の自動作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。
  9. デフォルトの変数名を選択し、「OK」をクリックします。デフォルトの変数名が「変数」フィールドに移入されます。入力変数が移入された状態で「Invoke」ダイアログが表示されます。
  10. 図5-123に示すように、「プロパティ」タブをクリックしてファイル変数を選択します。

    図5-123 「Invoke」ダイアログ

    図5-123の説明が続きます
    「図5-123 「起動」ダイアログ」の説明
  11. 「OK」をクリックします。
5.5.5.5.5 transformアクティビティの追加
  1. transformアクティビティを、「<case DATA FOUND>」セクション内のInvokeAppendアクティビティの直前にドラッグ・アンド・ドロップします。
  2. transformアクティビティをダブルクリックします。
  3. 「名前」フィールドにTransformPayloadと入力します。
  4. 「トランスフォーメーション」タブをクリックします。
  5. 「作成」アイコンをクリックします。「ソース変数」ダイアログが表示されます。
  6. 「InvokeReadAddress_SyncRead_InputVariable」を選択して「OK」をクリックします。
  7. 「ターゲット変数」リストで「InvokeAppend_Write_InputVariable」を選択します。
  8. 「マッパー・ファイル」フィールドの端にある「参照」をクリックし、addr1Toaddr2.xslファイルを選択します。
  9. 「OK」をクリックします。
  10. emptyアクティビティをswitchアクティビティの「<otherwise>」セクションにドラッグ・アンド・ドロップします。図5-124に示すように、「BPELChunkedRead.bpel」ページが表示されます。

    図5-124 JDeveloper - BPELChunkedRead.bpel

    図5-124の説明が続きます
    「図5-124 JDeveloper - BPELChunkedRead.bpel」の説明
  11. 「ファイル」「すべて保存」を順番にクリックします。
5.5.5.6 JDeveloperを使用したデプロイ

前述のステップで作成したSOAプロジェクトおよびアプリケーションについて、アプリケーション・プロファイルをデプロイする必要があります。JDeveloperを使用してアプリケーション・プロファイルをデプロイするには、次のステップを実行する必要があります。

  1. アプリケーション・サーバー接続を作成します。詳細は、「Oracle JCAアダプタ用のアプリケーション・サーバー接続の作成」を参照してください。
  2. アプリケーションをデプロイします。詳細は、「JDeveloperからのOracle JCAアダプタ・アプリケーションのデプロイ」を参照してください。
5.5.5.7 Oracle Fusion Middleware Controlコンソールを使用した監視

Fusion Middleware Controlコンソールを使用して、デプロイ済のSOAコンポジットを監視できます。次のステップを実行します。

  1. http://servername:portnumber/emにナビゲートします。デプロイしたコンポジットがアプリケーション・ナビゲータに表示されます。
  2. 作成したaddress-csv.txtファイル(「前提条件」を参照)を入力ディレクトリにコピーし、処理済であることを確認します。出力ディレクトリを調べて、出力ファイルが作成されていることを確認します。
  3. デプロイしたSOAコンポジットをクリックします。「ダッシュボード」が表示されます。

    「最新のインスタンス」領域で「インスタンスID」の値をノートにとります。

  4. 「インスタンス」タブをクリックします。SOAコンポジットのインスタンスIDがリスト表示されます。
  5. ステップ3でメモしたインスタンスIDをクリックします。「フローのトレース」ページが表示されます。
  6. BPELプロセス・インスタンスをクリックします。BPELプロセス・インスタンスの「監査証跡」が表示されます。
  7. ペイロード・ノードを開いてペイロード詳細を確認します。
  8. プロセス・フローを表示するには、「フロー」タブをクリックします。アクティビティをクリックして、アクティビティの詳細を表示します。

5.5.6 添付としてのOracleファイル・アダプタのRead File

これは、ファイル・システムのソース・ディレクトリから宛先ディレクトリに大量のデータを添付として不透明にコピーまたは移動するOracleファイル・アダプタ機能です。たとえば、大量のMS Word文書、イメージおよびPDFをコンポジット・アプリケーション内でコンテンツを処理せずに転送できます。添付としてのファイル読取り機能は、「Read File」オプションが選択されている場合にのみ使用できます。

この使用例では、大きい*.docファイルを添付として処理するOracleファイル・アダプタの機能について説明します。添付としてファイルを読み取るこの機能は、Opaque変換によく似ています。ただし、GB規模の添付が可能であるかどうかはデータベースの制限によって異なります。

この項には次のトピックが含まれます:

5.5.6.1 前提条件

Oracleファイル・アダプタのRead Fileを添付機能として使用するには、大きいMS Word文書(*.docファイル)が必要です。

5.5.6.2 SOAコンポジットの設計

SOAコンポジットを含んだJDeveloperアプリケーションを作成する必要があります。使用例のアプリケーションとプロジェクトを作成するステップは、次のとおりです。

  1. JDeveloper「アプリケーション・ナビゲータ」で、「新規アプリケーション」をクリックします。「汎用アプリケーションの作成 - アプリケーションの名前付け」ページが表示されます。
  2. 「アプリケーション名」フィールドにAttachmentAppと入力して「次へ」をクリックします。「汎用アプリケーションの作成 - プロジェクトの名前付け」ページが表示されます。
  3. 「プロジェクト名」フィールドにAttachmentと入力します。
  4. 「プロジェクト・テクノロジ」タブの「選択可能」リストで「SOA」をダブルクリックし、「選択済」リストに移動します。
  5. 「次へ」をクリックします。「SOA設定の構成」ダイアログが表示されます。
  6. 「コンポジット・テンプレート」ボックスで「BPELを使用するコンポジット」を選択して「終了」をクリックします。「BPELプロセスの作成 - BPELプロセス」ページが表示されます。
  7. 「名前」フィールドにBPELAttachmentと入力し、「テンプレート」リストから「サービスを後で定義」を選択します。
  8. 「OK」をクリックします。図5-125に示すように、AttachmentAppアプリケーションとAttachmentプロジェクトが設計領域に表示されます。

    図5-125 JDeveloper - composite.xml

    図5-125の説明が続きます
    「図5-125 JDeveloper - composite.xml」の説明
5.5.6.3 インバウンドOracleファイル・アダプタ・サービスの作成

ローカル・ディレクトリから大きいファイルを読み取るインバウンドのOracleファイル・アダプタ・サービスを作成するには、次のステップを実行します。

  1. 「コンポーネント」ウィンドウから「公開されたサービス」スイムレーンにファイル・アダプタをドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
  2. 「サービス名」フィールドにAttachmentInと入力します。
  3. 「次へ」をクリックします。「アダプタ・インタフェース」ページが表示されます。
  4. 「操作およびスキーマから定義(後で指定)」を選択して「次へ」をクリックします。「FTPサーバー接続」 ページが表示されます。
  5. 「FTPサーバー接続」画面で「FTPサーバーのJNDI名」に入力し、「次へ」をクリックします。
  6. 操作タイプとして「ファイルの読取り」を選択し、「ファイルを添付として読取り」を選択し、「次へ」をクリックします。「ファイル・ディレクトリ」ページが表示されます。

    ノート:

    「文字セット」、「エンコーディング」および「コンテンツ・タイプ」の各フィールドは無視してください。この添付の読取りを必要とするサード・パーティのアプリケーションを使用している場合にのみ、これらのフィールドに値を移入します。この使用例の添付は、最終的にアウトバウンドOracleファイル・アダプタによって使用されるため、これらの値は必要としません。

    図5-126 「アダプタ構成ウィザード - 操作」ページ

    図5-126の説明が続きます
    「図5-126 「アダプタ構成ウィザード - 操作」ページ」の説明
  7. 図5-66に示すように、入力ディレクトリの物理パスを入力して「次へ」をクリックします。「ファイルのフィルタ処理」ページが表示されます。
  8. 図5-67に示すように、「インクルード・ファイルの名前パターン」フィールドに*.docと入力します。
  9. 「次へ」をクリックします。「ファイル・ポーリング」ページが表示されます。
  10. 「次」をクリックします。
  11. 「JCAエンドポイント・プロパティ」画面で、「次へ」をクリックします。
    参照構成オプションを選択した場合、「JCAエンドポイント・プロパティ」画面が表示されます。詳細は、「アダプタ構成ウィザードのJCAエンドポイント・プロパティ」を参照してください。
  12. 「終了」をクリックします。インバウンドのOracleファイル・アダプタが構成され、composite.xmlが表示されます。

    図5-127 JDeveloper - composite.xml

    図5-127の説明が続きます
    「図5-127 JDeveloper - composite.xml」の説明
5.5.6.4 アウトバウンドOracleファイル・アダプタ・サービスの作成

ローカル・ディレクトリからFTPサーバーにファイルを書き込むアウトバウンドのOracleファイル・アダプタ・サービスを作成するには、次のステップを実行します。

  1. 「コンポーネント」ウィンドウから「外部参照」スイムレーンにファイル・アダプタをドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
  2. 「サービス名」フィールドにAttachmentOutと入力します。
  3. 「次へ」をクリックします。「アダプタ・インタフェース」ページが表示されます。
  4. 「操作およびスキーマから定義(後で指定)」を選択して「次へ」をクリックします。
  5. 「FTPサーバー接続」画面で「FTPサーバーのJNDI名」に入力し、「次へ」をクリックします。
  6. 「Write File」を選択して「次へ」をクリックします。「ファイル構成」ページが表示されます。
  7. 出力ディレクトリの物理パスを入力し、attachment_%SEQ%.doc「ファイル・ネーミング規則(po_%SEQ%.txt)」フィールドに入力します。
  8. 「次へ」をクリックします。「メッセージ」ページが表示されます。
  9. 「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
  10. 「プロジェクトのWSDLファイル」「AttachmentIn.wsdl」「インライン・スキーマ」および「attachmentElement」をクリックします。

    図5-128 「タイプ・チューザ」ダイアログ

    図5-128の説明が続きます
    「図5-128 「タイプ・チューザ」ダイアログ」の説明
  11. 「OK」をクリックします。「メッセージ」ページのURLフィールドにAttachmentIn.wsdlが移入されます。
  12. 「次へ」をクリックします。
  13. 「JCAエンドポイント・プロパティ」画面で、「次へ」をクリックします。
    参照構成オプションを選択した場合、「JCAエンドポイント・プロパティ」画面が表示されます。詳細は、「アダプタ構成ウィザードのJCAエンドポイント・プロパティ」を参照してください。
  14. 「終了」をクリックします。アウトバウンドのOracleファイル・アダプタが構成され、composite.xmlが表示されます。

    図5-129 JDeveloper - composite.xml

    図5-129の説明が続きます
    「図5-129 JDeveloper - composite.xml」の説明
5.5.6.5 サービスとアクティビティのワイヤリング

作成した3つのコンポーネント(インバウンド・アダプタ・サービス、BPELプロセス、アウトバウンド・アダプタ参照)をアセンブルまたは接続する必要があります。コンポーネントを接続するステップは、次のとおりです。

  1. 「公開されたサービス」領域にあるAttachmentIn内の小さい三角形を、「コンポーネント」領域のBPELプロセス内に緑の三角形として表示されるドロップ・ゾーンにドラッグします。
  2. 「コンポーネント」領域にあるBPELプロセス内の小さい三角形を、「外部参照」領域のAttachmentOut内に緑の三角形として表示されるドロップ・ゾーンにドラッグします。

    JDevelopercomposite.xml図5-130のように表示されます。

    図5-130 JDeveloper - composite.xml

    図5-130の説明が続きます
    「図5-130 JDeveloper - composite.xml」の説明
  3. 「ファイル」「すべて保存」を順番にクリックします。
5.5.6.5.1 receiveアクティビティの追加
  1. 「BPELAttachment」をダブルクリックします。「BPELAttachment.bpel」ページが表示されます。
  2. 「コンポーネント」ウィンドウから設計領域にreceiveアクティビティをドラッグ・アンド・ドロップします。
  3. receiveアクティビティをダブルクリックします。「Receive」ダイアログが表示されます。
  4. 「名前」フィールドにReceiveInputと入力します。
  5. 「パートナ・リンク」フィールドの端にある「パートナ・リンクの参照」をクリックします。「パートナ・リンク・チューザ」ダイアログが表示されます。
  6. 図5-131に示すように、「AttachmentIn」を選択して「OK」をクリックします。

    図5-131 「パートナ・リンク・チューザ」ダイアログ

    図5-131の説明が続きます
    「図5-131 「パートナ・リンク・チューザ」ダイアログ」の説明
  7. 図5-132に示すように、「Receive」ダイアログで「変数」フィールドの右にある「変数の自動作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。

    図5-132 「Receive」ダイアログ

    図5-132の説明が続きます
    「図5-132 「Receive」ダイアログ」の説明
  8. デフォルトの変数名を選択し、「OK」をクリックします。デフォルトの変数名が「変数」フィールドに移入されます。
  9. 「インスタンスの作成」を選択して、「OK」をクリックします。図5-133に示すように、JDeveloper「BPELAttachment.bpel」ページが表示されます。

    図5-133 JDeveloper - BPELXMLDebatching.bpel

    図5-133の説明が続きます
    「図5-133 JDeveloper - BPELXMLDebatching.bpel」の説明
5.5.6.5.2 invokeアクティビティの追加
  1. 「コンポーネント」ウィンドウから設計領域にinvokeアクティビティをドラッグ・アンド・ドロップします。
  2. invokeアクティビティをダブルクリックします。Invokeダイアログが表示されます。
  3. 「名前」フィールドにWrite_Attachmentと入力します。
  4. 「パートナ・リンク」フィールドの端にある「パートナ・リンクの参照」をクリックします。「パートナ・リンク・チューザ」ダイアログが表示されます。
  5. 図5-134に示すように、「AttachmentOut」を選択して「OK」をクリックします。

    図5-134 「パートナ・リンク・チューザ」ダイアログ

    図5-134の説明が続きます
    「図5-134 「パートナ・リンク・チューザ」ダイアログ」の説明
  6. 「Invoke」ダイアログで、「入力変数」フィールドの右にある「入力変数の自動作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。
  7. デフォルトの変数名を選択し、「OK」をクリックします。デフォルトの変数名が「変数」フィールドに移入されます。図5-135に示すように、Invokeダイアログが表示されます。

    図5-135 「Invoke」ダイアログ

    図5-135の説明が続きます
    「図5-135 「起動」ダイアログ」の説明
  8. 「OK」をクリックします。図5-136に示すように、JDeveloper「BPELAttachment.bpel」ページが表示されます。

    図5-136 JDeveloper - BPELXMLDebatching.bpel

    図5-136の説明が続きます
    「図5-136 JDeveloper - BPELXMLDebatching.bpel」の説明
5.5.6.5.3 assignアクティビティの追加
  1. 「コンポーネント」ウィンドウから設計領域のreceiveアクティビティとinvokeアクティビティの間にassignアクティビティをドラッグ・アンド・ドロップします。
  2. assignアクティビティをダブルクリックします。Assignダイアログが表示されます。
  3. 「名前」フィールドにAssignReferenceと入力します。
  4. 「コピー操作」タブをクリックします。図5-137に示すように、Assignダイアログが表示されます。

    図5-137 「Assign」ダイアログ - 「コピー操作」タブ

    図5-137の説明が続きます
    「図5-137 「Assign」ダイアログ - 「コピー操作」タブ」の説明
  5. 「コピー操作」を選択します。「コピー操作の作成」ダイアログが表示されます。
  6. 図5-138に示すように、「From」および「To」ペインで「変数」を開きます。

    図5-138 「コピー操作の作成」ダイアログ

    図5-138の説明が続きます
    「図5-138 「コピー操作の作成」ダイアログ」の説明

    ノート:

    変数が要素への参照によって定義される場合、ソースとターゲットの両方が同じ要素であることが必要です。

  7. 「OK」をクリックします。図5-139に示すように、Assignダイアログが表示されます。

    図5-139 「Assign」ダイアログ

    図5-139の説明が続きます
    「図5-139 「Assign」ダイアログ」の説明
  8. 「OK」をクリックします。図5-140に示すように、JDeveloperの「BPELAttachment.bpel」ページが表示されます。

    図5-140 JDeveloper - BPELScalableDOM.bpel

    図5-140の説明が続きます
    「図5-140 JDeveloper - BPELScalableDOM.bpel」の説明
  9. 「ファイル」「すべて保存」を順番にクリックします。
5.5.6.6 JDeveloperを使用したデプロイ

前述のステップで作成したSOAプロジェクトおよびアプリケーションについて、アプリケーション・プロファイルをデプロイする必要があります。JDeveloperを使用してアプリケーション・プロファイルをデプロイするには、次のステップを実行する必要があります。

  1. アプリケーション・サーバー接続を作成します。詳細は、「Oracle JCAアダプタ用のアプリケーション・サーバー接続の作成」を参照してください。
  2. アプリケーションをデプロイします。詳細は、「JDeveloperからのOracle JCAアダプタ・アプリケーションのデプロイ」を参照してください。
5.5.6.7 Oracle Fusion Middleware Controlコンソールを使用した監視

Fusion Middleware Controlコンソールを使用して、デプロイ済のSOAコンポジットを監視できます。次のステップを実行します。

  1. http://servername:portnumber/emにナビゲートします。デプロイしたコンポジットがアプリケーション・ナビゲータに表示されます。
  2. 作成したattachment.docファイル(「前提条件」を参照)を入力ディレクトリにコピーし、処理済であることを確認します。出力ディレクトリを調べて、出力ファイルが作成されていることを確認します。
  3. デプロイしたSOAコンポジットをクリックします。「ダッシュボード」が表示されます。

    「最新のインスタンス」領域で「インスタンスID」の値をノートにとります。

  4. 「インスタンス」タブをクリックします。SOAコンポジットのインスタンスIDがリスト表示されます。
  5. ステップ3でメモしたインスタンスIDをクリックします。「フローのトレース」ページが表示されます。
  6. BPELプロセス・インスタンスをクリックします。BPELプロセス・インスタンスの「監査証跡」が表示されます。
  7. ペイロード・ノードを開いてペイロード詳細を確認します。
  8. プロセス・フローを表示するには、「フロー」タブをクリックします。アクティビティをクリックして、アクティビティの詳細を表示します。

5.5.7 Oracleファイル・アダプタのファイル・リスティング

これは、invokeアクティビティを使用してターゲット・ディレクトリからファイルのリストを取得するOracleファイル・アダプタ機能です。このファイルのリストはXML文書として返され、ファイル名、ディレクトリ名、ファイル・サイズ、最終変更時間などの情報が記載されています。

この項には次のトピックが含まれます:

5.5.7.1 前提条件

Oracleファイル・アダプタによるリスト表示を実行するには、*.txtファイルが必要です。*.txtファイルの作成および保存は、ターゲット・ディレクトリで行う必要があります。

5.5.7.2 SOAコンポジットの設計

SOAコンポジットを含んだJDeveloperアプリケーションを作成する必要があります。使用例のアプリケーションとプロジェクトを作成するステップは、次のとおりです。

  1. JDeveloper「アプリケーション・ナビゲータ」で、「新規アプリケーション」をクリックします。「汎用アプリケーションの作成 - アプリケーションの名前付け」ページが表示されます。
  2. 「アプリケーション名」フィールドにFileListingAppと入力して「次へ」をクリックします。「汎用アプリケーションの作成 - プロジェクトの名前付け」ページが表示されます。
  3. 「プロジェクト名」フィールドにFileListingと入力します。
  4. 「プロジェクト・テクノロジ」タブの「選択可能」リストで「SOA」をダブルクリックし、「選択済」リストに移動します。
  5. 「次へ」をクリックします。「SOA設定の構成」ダイアログが表示されます。
  6. 「コンポジット・テンプレート」ボックスで「BPELを使用するコンポジット」を選択して「終了」をクリックします。「BPELプロセスの作成 - BPELプロセス」ページが表示されます。
  7. 「名前」フィールドにBPELFileListingと入力し、「テンプレート」ボックスから「一方向BPELプロセス」を選択します。
  8. 「OK」をクリックします。図5-141に示すように、FileListingAppアプリケーションとFileListingプロジェクトが設計領域に表示されます。

    図5-141 JDeveloper - composite.xml

    図5-141の説明が続きます
    「図5-141 JDeveloper - composite.xml」の説明
5.5.7.3 アウトバウンドOracleファイル・アダプタ・サービスの作成

ターゲット・ディレクトリのファイルのリストを表示するアウトバウンドOracleファイル・アダプタ・サービスを作成するには、次のステップを実行します。

  1. 「コンポーネント」ウィンドウから「外部参照」スイムレーンにファイル・アダプタをドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
  2. 「サービス名」フィールドにListFilesと入力します。
  3. 「次へ」をクリックします。「アダプタ・インタフェース」ページが表示されます。
  4. 「操作およびスキーマから定義(後で指定)」を選択して「次へ」をクリックします。
  5. 「FTPサーバー接続」画面で「FTPサーバーのJNDI名」に入力し、「次へ」をクリックします。
  6. 「List Files」を選択し、「操作名」フィールドにFileListingと入力して「次へ」をクリックします。「ファイル・ディレクトリ」ページが表示されます。
  7. 入力ディレクトリの物理パスを入力します。
  8. 「次へ」をクリックします。「ファイルのフィルタ処理」ページが表示されます。
  9. 「インクルード・ファイルの名前パターン」フィールドに*.txtと入力します。
  10. 「次へ」をクリックします。
  11. 「JCAエンドポイント・プロパティ」画面で、「次へ」をクリックします。
    参照構成オプションを選択した場合、「JCAエンドポイント・プロパティ」画面が表示されます。詳細は、「アダプタ構成ウィザードのJCAエンドポイント・プロパティ」を参照してください。
  12. 「終了」をクリックします。アウトバウンドのOracleファイル・アダプタが構成され、composite.xmlが表示されます。

    図5-142 JDeveloper - composite.xml

    図5-142の説明が続きます
    「図5-142 JDeveloper - composite.xml」の説明
  13. 「ファイル」「すべて保存」を順番にクリックします。
5.5.7.4 サービスとアクティビティのワイヤリング

作成した2つのコンポーネント(BPELプロセスおよびアウトバウンド・アダプタ参照)をアセンブルまたは接続する必要があります。コンポーネントを接続するステップは、次のとおりです。

  1. 「コンポーネント」領域にあるBPELプロセス内の小さい三角形を、「外部参照」領域のListFiles内に緑の三角形として表示されるドロップ・ゾーンにドラッグします。

    JDevelopercomposite.xml図5-143のように表示されます。

    図5-143 JDeveloper - composite.xml

    図5-143の説明が続きます
    「図5-143 JDeveloper - composite.xml」の説明
  2. 「ファイル」「すべて保存」を順番にクリックします。
5.5.7.4.1 文字列変数の作成
  1. 「BPELFileListing」をダブルクリックします。「BPELFileListing.bpel」ページが表示されます。
  2. (x)で表された「変数」アイコンをクリックします。「変数」ダイアログが表示されます。
  3. 「作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。
  4. 図5-144に示すように、タイプがxsd:stringの変数MyDirを作成します(これは後で使用します)。

    図5-144 「変数」ダイアログ

    図5-144の説明が続きます
    「図5-144 「変数」ダイアログ」の説明
  5. 「OK」をクリックします。図5-145に示すように、JDeveloperの「BPELFileListing.bpel」ページが表示されます

    図5-145 JDeveloper - BPELFileListing.bpel

    図5-145の説明が続きます
    「図5-145 JDeveloper - BPELFileListing.bpel」の説明
5.5.7.4.2 invokeアクティビティの追加
  1. 「コンポーネント」ウィンドウから設計領域のreceiveアクティビティの下にinvokeアクティビティをドラッグ・アンド・ドロップします。
  2. invokeアクティビティをダブルクリックします。Invokeダイアログが表示されます。
  3. 「名前」フィールドにInvokeListFilesと入力します。
  4. 「パートナ・リンク」フィールドの端にある「パートナ・リンクの参照」をクリックします。「パートナ・リンク・チューザ」ダイアログが表示されます。
  5. 「ListFiles」を選択して「OK」をクリックします。
  6. 「Invoke」ダイアログで、「入力変数」フィールドの右にある「入力変数の自動作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。
  7. デフォルトの変数名を選択し、「OK」を選択します。デフォルトの変数名が「変数」フィールドに移入されます。入力変数が移入された状態で「Invoke」ダイアログが表示されます。
  8. 同じ手順を繰り返して出力変数を選択します。図5-146に示すように、Invokeダイアログが表示されます。

    図5-146 「Invoke」ダイアログ

    図5-146の説明が続きます
    「図5-146 「起動」ダイアログ」の説明
  9. 「プロパティ」タブをクリックします。プロパティおよび対応する値の列が表示されます。
  10. jca.file.Directoryプロパティを選択します。対応する値の列をダブルクリックします。「アダプタ・プロパティ値」ダイアログが表示されます。
  11. 「変数の参照」アイコンをクリックします。「変数XPathビルダー」ダイアログが表示されます。
  12. 「変数」を開いて「MyDir」を選択し、「OK」をクリックします。jca.file.Directoryの値がMydirに設定されます。
  13. 「OK」をクリックします。図5-147に示すように、JDeveloperの「BPELFileListing.bpel」ページが表示されます。

    図5-147 JDeveloper - BPELFileListing.bpel

    図5-147の説明が続きます
    「図5-147 JDeveloper - BPELFileListing.bpel」の説明
5.5.7.4.3 assignアクティビティの追加
  1. 「コンポーネント」ウィンドウから設計領域のreceiveアクティビティとinvokeアクティビティの間にassignアクティビティをドラッグ・アンド・ドロップします。
  2. assignアクティビティをダブルクリックします。Assignダイアログが表示されます。
  3. 「名前」フィールドにAssignDirNameと入力します。
  4. 「コピー操作」タブをクリックします。Assignダイアログが表示されます。
  5. 「コピー操作」を選択します。「コピー操作の作成」ダイアログが表示されます。
  6. 図5-148に示すように、ヘッダーの値を設定します。

    図5-148 「Assign」ダイアログ

    図5-148の説明が続きます
    「図5-148 「Assign」ダイアログ」の説明
  7. 「OK」をクリックします。図5-149に示すように、JDeveloperの「BPELFileListing.bpel」ページが表示されます。

    図5-149 JDeveloper - BPELFileListing.bpel

    図5-149の説明が続きます
    「図5-149 JDeveloper - BPELFileListing.bpel」の説明
  8. 「ファイル」「すべて保存」を順番にクリックします。
5.5.7.5 JDeveloperを使用したデプロイ

前述のステップで作成したSOAプロジェクトおよびアプリケーションについて、アプリケーション・プロファイルをデプロイする必要があります。JDeveloperを使用してアプリケーション・プロファイルをデプロイするには、次のステップを実行する必要があります。

  1. アプリケーション・サーバー接続を作成します。詳細は、「Oracle JCAアダプタ用のアプリケーション・サーバー接続の作成」を参照してください。
  2. アプリケーションをデプロイします。詳細は、「JDeveloperからのOracle JCAアダプタ・アプリケーションのデプロイ」を参照してください。
5.5.7.6 Oracle Fusion Middleware Controlコンソールを使用した監視

Fusion Middleware Controlコンソールを使用して、デプロイ済のSOAコンポジットを監視できます。次のステップを実行します。

  1. http://servername:portnumber/emにナビゲートします。デプロイしたコンポジットがアプリケーション・ナビゲータに表示されます。
  2. 作成した*.txtファイル(「前提条件」を参照)を入力ディレクトリにコピーし、処理済であることを確認します。出力ディレクトリを調べて、出力ファイルが作成されていることを確認します。
  3. デプロイしたSOAコンポジットをクリックします。「ダッシュボード」が表示されます。

    「最新のインスタンス」領域で「インスタンスID」の値をノートにとります。

  4. 「インスタンス」タブをクリックします。SOAコンポジットのインスタンスIDがリスト表示されます。
  5. ステップ3でメモしたインスタンスIDをクリックします。「フローのトレース」ページが表示されます。
  6. BPELプロセス・インスタンスをクリックします。BPELプロセス・インスタンスの「監査証跡」が表示されます。
  7. ペイロード・ノードを開いてペイロード詳細を確認します。
  8. プロセス・フローを表示するには、「フロー」タブをクリックします。アクティビティをクリックして、アクティビティの詳細を表示します。

5.5.8 Oracleファイル・アダプタの複雑な構造

この使用例では、カスタム・フォーマットで定義されたネイティブ・データを処理するOracleファイル・アダプタ機能について説明します。このサンプルでは、カスタム・フォーマットはinvoice-nxsd.xsdに定義されている請求書を表します。Oracleファイル・アダプタでは、invoice.txtファイルを処理してComplexStructure BPELプロセスにパブリッシュします。その後、PurchaseOrderに変換されてxmlファイルとして書き出されます。

この項には次のトピックが含まれます:

5.5.8.1 前提条件

複雑な構造のビジネス・プロセスを実行するには、まず次のファイルを作成する必要があります:

  • invoice-nxsd.xsd

  • po.xsd

  • InvToPo.xsl

  • invoice.txt

invoice-nxsd.xsdの内容

<schema targetNamespace="http://xmlns.oracle.com/pcbpel/demoSchema/invoice-nxsd"
        xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
        xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:tns="http://xmlns.oracle.com/pcbpel/demoSchema/invoice-nxsd"
        elementFormDefault="qualified" attributeFormDefault="qualified"
        nxsd:version="NXSD" nxsd:stream="chars">
  <element name="invoice" type="tns:invoiceType"/>
  <complexType name="invoiceType">
    <sequence>
      <element name="purchaser" type="tns:partnerType"/>
      <element name="seller" type="tns:partnerType"/>
      <element name="line-item" type="tns:line-itemType" maxOccurs="unbounded"
               nxsd:style="array" nxsd:cellSeparatedBy="${eol}"
               nxsd:arrayTerminatedBy="#"/>
      <element name="total" type="double" nxsd:style="terminated"
               nxsd:terminatedBy="${eol}"/>
    </sequence>
  </complexType>
  <complexType name="partnerType">
    <sequence>
      <element name="uid" type="string" nxsd:style="fixedLength" nxsd:length="7"
               nxsd:padStyle="tail" nxsd:paddedBy=" "/>
      <element name="name" type="string" nxsd:style="surrounded"
               nxsd:surroundedBy="^"/>
      <element name="address" type="tns:addressType"/>
    </sequence>
  </complexType>
  <complexType name="addressType">
    <sequence>
      <element name="street1" type="string" nxsd:style="fixedLength"
               nxsd:length="15" nxsd:padStyle="tail" nxsd:paddedBy=" "/>
      <element name="street2" type="string" nxsd:style="fixedLength"
               nxsd:length="10" nxsd:padStyle="tail" nxsd:paddedBy=" "/>
      <element name="city" type="string" nxsd:style="fixedLength"
               nxsd:length="15" nxsd:padStyle="tail" nxsd:paddedBy=" "/>
      <element name="postal-code" type="string" nxsd:style="fixedLength"
               nxsd:length="5" nxsd:padStyle="none"/>
      <element name="country" type="string" nxsd:style="fixedLength"
               nxsd:length="2" nxsd:padStyle="none"/>
      <element name="state" type="string" nxsd:style="fixedLength"
               nxsd:length="2" nxsd:padStyle="none"/>
      <element name="phone" type="string" nxsd:style="terminated"
               nxsd:terminatedBy="${eol}"/>
    </sequence>
  </complexType>
  <complexType name="line-itemType">
    <sequence>
      <element name="uid" type="string" nxsd:style="fixedLength" nxsd:length="3"
               nxsd:padStyle="none"/>
      <element name="description" type="string" nxsd:style="surrounded"
               nxsd:surroundedBy="|"/>
      <element name="price" type="double" nxsd:style="terminated"
               nxsd:terminatedBy=","/>
      <element name="quantity" type="integer" nxsd:style="terminated"
               nxsd:terminatedBy=","/>
      <element name="line-total" type="double" nxsd:style="surrounded"
               nxsd:surroundedBy="+"/>
    </sequence>
  </complexType>
</schema>

po.xsdの内容

<schema attributeFormDefault="qualified" elementFormDefault="qualified" 
                targetNamespace="http://xmlns.oracle.com/pcbpel/demoSchema/po"         
                xmlns:pons="http://xmlns.oracle.com/pcbpel/demoSchema/po"
                xmlns="http://www.w3.org/2001/XMLSchema" >
	    <element name="po" type="pons:poType"/>
	    <complexType name="poType"> 
	    	<sequence>
	    	   <element name="header" type="pons:headerType"/>
	    	   <element name="body" type="pons:bodyType"/>
	    	   <element name="footer" type="pons:footerType"/>		  
	        </sequence>
	     </complexType>
	     <complexType name="headerType"> 
	    	<sequence>
	    	   <element name="date" type="dateTime"/>
	    	   <element name="supplier" type="pons:poPartnerType"/>
	    	   <element name="buyer" type="pons:poPartnerType"/>
	    	</sequence>
	     </complexType>
	     <complexType name="poPartnerType"> 
	    	<sequence>
	    	    <element name="name" type="string"/>
	            <element name="uid" type="string"/>
	            <element name="address" type="pons:poAddressType"/>
	    	</sequence>		 
	     </complexType>
	     <complexType name="poAddressType"> 
	    	<sequence>
	    	    <element name="street" type="string"/>
	    	    <element name="city" type="string"/>
	    	    <element name="zip" type="string"/>
	    	    <element name="state" type="string"/>
	    	</sequence>
	     </complexType>	   
	     <complexType name="bodyType"> 
	    	<sequence>
	    	    <element name="item" type="pons:itemType" maxOccurs="unbounded"/>
	    	</sequence>
	     </complexType>	   
	     <complexType name="itemType"> 
	    	<sequence>
	    	    <element name="uid" type="string"/>
	    	    <element name="name" type="string"/>
	    	    <element name="price" type="double"/>
	    	    <element name="quantity" type="integer"/>
	        </sequence>
	     </complexType>
	     <complexType name="footerType"> 
	    	<sequence>
	    	    <element name="comment" type="string"/>
	    	</sequence>
	     </complexType>
</schema>

InvToPo.xslの内容

<?xml version="1.0" encoding="windows-1252"?>
<?oracle-xsl-mapper
  <!-- SPECIFICATION OF MAP SOURCES AND TARGETS, DO NOT MODIFY. -->
  <mapSources>
    <source type="XSD">
      <schema location="invoice-nxsd.xsd"/>
      <rootElement name="invoice" namespace="http://xmlns.oracle.com/pcbpel/demoSchema/invoice-nxsd"/>
    </source>
  </mapSources>
  <mapTargets>
    <target type="XSD">
      <schema location="po.xsd"/>
      <rootElement name="po" namespace="http://xmlns.oracle.com/pcbpel/demoSchema/po"/>
    </target>
  </mapTargets>
  <!-- GENERATED BY ORACLE XSL MAPPER 1.0 AT [TUE NOV 16 15:32:26 IST 2004]. -->
?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:tns="http://xmlns.oracle.com/pcbpel/demoSchema/invoice-nxsd"
                xmlns:na0="http://www.w3.org/2001/XMLSchema"
                xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
                xmlns:pons="http://xmlns.oracle.com/pcbpel/demoSchema/po"
                exclude-result-prefixes="xsl tns na0 nxsd pons">
  <xsl:template match="/">
    <pons:po>
      <pons:header>
        <pons:supplier>
          <pons:name>
            <xsl:value-of select="/tns:invoice/tns:seller/tns:name"/>
          </pons:name>
          <pons:uid>
            <xsl:value-of select="/tns:invoice/tns:seller/tns:uid"/>
          </pons:uid>
          <pons:address>
            <pons:street>
              <xsl:value-of select="concat(/tns:invoice/tns:seller/tns:address/tns:street1,/tns:invoice/tns:seller/tns:address/tns:street2)"/>
            </pons:street>
            <pons:city>
              <xsl:value-of select="/tns:invoice/tns:seller/tns:address/tns:city"/>
            </pons:city>
            <pons:zip>
              <xsl:value-of select="/tns:invoice/tns:seller/tns:address/tns:postal-code"/>
            </pons:zip>
            <pons:state>
              <xsl:value-of select="/tns:invoice/tns:seller/tns:address/tns:state"/>
            </pons:state>
          </pons:address>
        </pons:supplier>
        <pons:buyer>
          <pons:name>
            <xsl:value-of select="/tns:invoice/tns:purchaser/tns:name"/>
          </pons:name>
          <pons:uid>
            <xsl:value-of select="/tns:invoice/tns:purchaser/tns:uid"/>
          </pons:uid>
          <pons:address>
            <pons:street>
              <xsl:value-of select="concat(/tns:invoice/tns:seller/tns:address/tns:street1,/tns:invoice/tns:seller/tns:address/tns:street2)"/>
            </pons:street>
            <pons:city>
              <xsl:value-of select="/tns:invoice/tns:purchaser/tns:address/tns:city"/>
            </pons:city>
            <pons:zip>
              <xsl:value-of select="/tns:invoice/tns:purchaser/tns:address/tns:postal-code"/>
            </pons:zip>
            <pons:state>
              <xsl:value-of select="/tns:invoice/tns:purchaser/tns:address/tns:state"/>
            </pons:state>
          </pons:address>
        </pons:buyer>
      </pons:header>
      <pons:body>
        <xsl:for-each select="/tns:invoice/tns:line-item">
          <pons:item>
            <pons:uid>
              <xsl:value-of select="tns:uid"/>
            </pons:uid>
            <pons:name>
              <xsl:value-of select="tns:description"/>
            </pons:name>
            <pons:price>
              <xsl:value-of select="tns:price"/>
            </pons:price>
            <pons:quantity>
              <xsl:value-of select="tns:quantity"/>
            </pons:quantity>
          </pons:item>
        </xsl:for-each>
      </pons:body>
      <pons:footer>
        <pons:comment>
          The po total is
          <xsl:value-of select="/tns:invoice/tns:total"/>
        </pons:comment>
      </pons:footer>
    </pons:po>
  </xsl:template>
</xsl:stylesheet>

invoice.txtの内容

6335722^Company One^First Street   999       San Jose       95129USCA650-801-6250
       ^Oracle^Bridge Parkway 1600      Redwood Shores 94065USCA650-506-7000
001|BPEL Process Manager Enterprise Edition|20000,2,+40000+
002|BPEL Process Manager Standard Edition|10000,5,+50000+
003|BPEL Process Manager Developer Edition|1000,20,+20000+#110000
5.5.8.2 SOAコンポジットの設計

SOAコンポジットを含んだJDeveloperアプリケーションを作成する必要があります。使用例のアプリケーションとプロジェクトを作成するステップは、次のとおりです。

  1. JDeveloper「アプリケーション・ナビゲータ」で、「新規アプリケーション」をクリックします。「汎用アプリケーションの作成 - アプリケーションの名前付け」ページが表示されます。
  2. 「アプリケーション名」フィールドにSOA-ComplexStructureと入力して「次へ」をクリックします。「汎用アプリケーションの作成 - プロジェクトの名前付け」ページが表示されます。
  3. 「プロジェクト名」フィールドにComplexStructureと入力します。
  4. 「プロジェクト・テクノロジ」タブの「選択可能」リストで「SOA」をダブルクリックし、「選択済」リストに移動します。
  5. 「次へ」をクリックします。「SOA設定の構成」ダイアログが表示されます。
  6. 「コンポジット・テンプレート」ボックスで「BPELを使用するコンポジット」を選択して「終了」をクリックします。「BPELプロセスの作成 - BPELプロセス」ページが表示されます。
  7. 「名前」フィールドにBPEComplexStructureと入力し、「テンプレート」ボックスから「サービスを後で定義」を選択します。
  8. 「OK」をクリックします。図5-150に示すように、SOA-ComplexStructureアプリケーションとComplexStructureプロジェクトが設計領域に表示されます。

    図5-150 JDeveloper - composite.xml

    図5-150の説明が続きます
    「図5-150 JDeveloper - composite.xml」の説明
  9. 作成したinvoice-nxsd.xsdおよびpo.xsdファイル(「前提条件」を参照)をプロジェクトのschemaディレクトリにコピーします。
  10. 作成したInvToPo.xsl (「前提条件」を参照)をプロジェクトのxslディレクトリにコピーします。
5.5.8.3 インバウンドOracleファイル・アダプタ・サービスの作成

ローカル・ディレクトリからファイルを読み取るインバウンドのOracleファイル・アダプタ・サービスを作成するには、次のステップを実行します。

  1. 「コンポーネント」ウィンドウから「公開されたサービス」スイムレーンにファイル・アダプタをドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
  2. 「サービス名」フィールドにComplex Structure Inと入力します。
  3. 「次へ」をクリックします。「アダプタ・インタフェース」ページが表示されます。
  4. 「操作およびスキーマから定義(後で指定)」を選択して「次へ」をクリックします。
  5. 「FTPサーバー接続」画面で「FTPサーバーのJNDI名」に入力し、「次へ」をクリックします。
  6. 「Read File」を選択して「次へ」をクリックします。「ファイル・ディレクトリ」ページが表示されます。
  7. 入力ディレクトリの物理パスを入力して「次へ」をクリックします。「ファイルのフィルタ処理」ページが表示されます。
  8. 「インクルード・ファイルの名前パターン」フィールドに*.txtと入力して「次へ」をクリックします。「ファイル・ポーリング」ページが表示されます。
  9. 「次へ」をクリックします。「メッセージ」ページが表示されます。
  10. 「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
  11. 「プロジェクトのスキーマ・ファイル」「invoice-nxsd.xsd」および「invoice」を順番にクリックします。
  12. 「OK」をクリックします。「メッセージ」ページの「URL」フィールドにinvoice-nxsd.xsdファイルが移入されます。
  13. 「次」をクリックします。
  14. 「JCAエンドポイント・プロパティ」画面で、「次へ」をクリックします。
    「参照構成」オプションを選択した場合、「JCAエンドポイント・プロパティ」画面が表示されます。詳細は、「アダプタ構成ウィザードのJCAエンドポイント・プロパティ」を参照してください。
  15. 「終了」をクリックします。インバウンドのOracleファイル・アダプタが構成され、composite.xmlが表示されます。

    図5-151 JDeveloper - composite.xml

    図5-151の説明が続きます
    「図5-151 JDeveloper - composite.xml」の説明
5.5.8.4 アウトバウンドOracleファイル・アダプタ・サービスの作成

ローカル・ディレクトリからFTPサーバーにファイルを書き込むアウトバウンドのOracleファイル・アダプタ・サービスを作成するには、次のステップを実行します。

  1. 「コンポーネント」ウィンドウから「外部参照」スイムレーンにOracleファイル・アダプタをドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
  2. 「サービス名」フィールドにComplexStructureOutと入力します。
  3. 「次へ」をクリックします。「アダプタ・インタフェース」ページが表示されます。
  4. 「操作およびスキーマから定義(後で指定)」を選択して「次へ」をクリックします。
  5. 「FTPサーバー接続」画面で「FTPサーバーのJNDI名」に入力し、「次へ」をクリックします。
  6. 「Write File」を選択して「次へ」をクリックします。「ファイル構成」ページが表示されます。
  7. 出力ディレクトリの物理パスを入力し、「ファイル・ネーミング規則(po_%SEQ%.txt)」フィールドにinvoice_%SEQ%.txtと入力します。
  8. 「次へ」をクリックします。「メッセージ」ページが表示されます。
  9. 「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
  10. 「プロジェクトのスキーマ・ファイル」「po.xsd」および「po」を順番にクリックします。
  11. 「OK」をクリックします。「メッセージ」ページの「URL」フィールドにpo.xsdファイルが移入されます。
  12. 「次」をクリックします。
  13. 「JCAエンドポイント・プロパティ」画面で、「次へ」をクリックします。
    参照構成オプションを選択した場合、「JCAエンドポイント・プロパティ」画面が表示されます。詳細は、「アダプタ構成ウィザードのJCAエンドポイント・プロパティ」を参照してください。
  14. 「終了」をクリックします。アウトバウンドのOracleファイル・アダプタが構成され、composite.xmlが表示されます。

    図5-152 JDeveloper - composite.xml

    図5-152の説明が続きます
    「図5-152 JDeveloper - composite.xml」の説明
5.5.8.5 サービスとアクティビティのワイヤリング

作成した3つのコンポーネント(インバウンド・アダプタ・サービス、BPELプロセス、アウトバウンド・アダプタ参照)をアセンブルまたは接続する必要があります。コンポーネントを接続するステップは、次のとおりです。

  1. 「公開されたサービス」領域にあるComplexStructureInサービス内の小さい三角形を、「コンポーネント」領域のBPELプロセス内に緑の三角形として表示されるドロップ・ゾーンにドラッグします。
  2. 「コンポーネント」領域にあるBPELプロセス内の小さい三角形を、「外部参照」領域のComplexStructureOut参照内に緑の三角形として表示されるドロップ・ゾーンにドラッグします。

    JDevelopercomposite.xml図5-153のように表示されます。

    図5-153 JDeveloper - composite.xml

    図5-153の説明が続きます
    「図5-153 JDeveloper - composite.xml」の説明
  3. 「ファイル」「すべて保存」を順番にクリックします。
5.5.8.5.1 receiveアクティビティの追加
  1. 「BPELComplexStructure」をダブルクリックします。「BPELComplexStructure.bpel」ページが表示されます。
  2. 「コンポーネント」ウィンドウから設計領域にreceiveアクティビティをドラッグ・アンド・ドロップします。
  3. receiveアクティビティをダブルクリックします。「Receive」ダイアログが表示されます。
  4. 「名前」フィールドにReceiveInvoiceと入力します。
  5. 「パートナ・リンク」フィールドの端にある「パートナ・リンクの参照」をクリックします。「パートナ・リンク・チューザ」ダイアログが表示されます。
  6. 「ComplexStructureIn」を選択して「OK」をクリックします。
  7. 「Receive」ダイアログで、「変数」フィールドの右にある「変数の自動作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。
  8. デフォルトの変数名を選択し、「OK」をクリックします。デフォルトの変数名が「変数」フィールドに移入されます。
  9. 「インスタンスの作成」を選択して、「OK」をクリックします。JDeveloperの「BPELComplexStructure.bpel」ページが表示されます。
5.5.8.5.2 invokeアクティビティの追加
  1. 「コンポーネント」ウィンドウから設計領域にinvokeアクティビティをドラッグ・アンド・ドロップします。
  2. invokeアクティビティをダブルクリックします。Invokeダイアログが表示されます。
  3. 「名前」フィールドにInvokeWriteと入力します。
  4. 「パートナ・リンク」フィールドの端にある「パートナ・リンクの参照」をクリックします。「パートナ・リンク・チューザ」ダイアログが表示されます。
  5. 「ComplexStructureOut」を選択して「OK」をクリックします。
  6. 「Invoke」ダイアログで、「入力変数」フィールドの右にある「入力変数の自動作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。
  7. 「変数名」フィールドにInvokeWrite_Write_OutputVariableと入力し、「OK」をクリックします。「Invoke」ダイアログが表示されます。
  8. 「OK」をクリックします。JDeveloper「BPELComplexStructure.bpel」ページが表示されます。
5.5.8.5.3 transformアクティビティの追加
  1. 「コンポーネント」ウィンドウから設計領域のreceiveアクティビティとinvokeアクティビティの間にtransformアクティビティをドラッグ・アンド・ドロップします。
  2. transformアクティビティをダブルクリックします。「Transform」ダイアログが表示されます。
  3. 「名前」フィールドにTransformPayloadと入力します。
  4. 「トランスフォーメーション」タブをクリックします。「Transform」ダイアログが表示されます。
  5. 「作成」アイコンを選択します。「ソース変数」ダイアログが表示されます。
  6. 「ソース変数」ボックスで「ReceiveInvoice_Read_InputVariable」を選択し、「ソース・パート」ボックスで「body」を選択して「OK」をクリックします。「ソース」と「パート」が選択された状態で「変換」ダイアログが表示されます。
  7. 「ターゲット変数」リストで「InvokeWrite_Write_OutputVariable」を選択し、「ターゲット・パート」で「body」を選択します。
  8. 「マッパー・ファイル」フィールドの端にある「マッピングの参照」アイコンをクリックし、プロジェクトのxslディレクトリからInvToPo.xslファイルを選択します。
  9. 「OK」をクリックします。
  10. 「ファイル」「すべて保存」を順番にクリックします。図5-154に示すように、「BPELComplexStructure.bpel」ページが表示されます。

    図5-154 JDeveloper - BPELComplexStructure.bpel

    図5-154の説明が続きます
    「図5-154 JDeveloper - BPELComplexStructure.bpel」の説明
5.5.8.6 JDeveloperを使用したデプロイ

前述のステップで作成したSOAプロジェクトおよびアプリケーションについて、アプリケーション・プロファイルをデプロイする必要があります。JDeveloperを使用してアプリケーション・プロファイルをデプロイするには、次のステップを実行する必要があります。

  1. アプリケーション・サーバー接続を作成します。詳細は、「Oracle JCAアダプタ用のアプリケーション・サーバー接続の作成」を参照してください。
  2. アプリケーションをデプロイします。詳細は、「JDeveloperからのOracle JCAアダプタ・アプリケーションのデプロイ」を参照してください。
5.5.8.7 Oracle Fusion Middleware Controlコンソールを使用した監視

Fusion Middleware Controlコンソールを使用して、デプロイ済のSOAコンポジットを監視できます。次のステップを実行します。

  1. http://servername:portnumber/emにナビゲートします。デプロイしたコンポジットがアプリケーション・ナビゲータに表示されます。
  2. 作成したinvoice.txtファイル(「前提条件」を参照)を入力ディレクトリにコピーし、処理済であることを確認します。出力ディレクトリを調べて、出力ファイルが作成されていることを確認します。
  3. デプロイしたSOAコンポジットをクリックします。「ダッシュボード」が表示されます。

    「最新のインスタンス」領域で「インスタンスID」の値をノートにとります。

  4. 「インスタンス」タブをクリックします。SOAコンポジットのインスタンスIDがリスト表示されます。
  5. ステップ3でメモしたインスタンスIDをクリックします。「フローのトレース」ページが表示されます。
  6. BPELプロセス・インスタンスをクリックします。BPELプロセス・インスタンスの「監査証跡」が表示されます。
  7. ペイロード・ノードを開いてペイロード詳細を確認します。
  8. プロセス・フローを表示するには、「フロー」タブをクリックします。アクティビティをクリックして、アクティビティの詳細を表示します。
  9. 「ReceiveInvoice」をクリックしてアクティビティ詳細を表示します

5.5.9 Oracle FTPアダプタのデバッチ処理

これは、大きいXML文書を小さい個別のXMLフラグメントにデバッチするOracle FTPアダプタの機能です。この使用例では、ビジネス・プロセス・サンプルのデバッチ処理でOracle FTPアダプタを使用して、1つ以上の請求書や発注などのビジネス・レコードのバッチを含むファイルを処理する方法について説明します。これにより、発注(PO)がデバッチされて個別の出力ファイルに書き込まれます。

この項には次のトピックが含まれます:

5.5.9.1 前提条件

複雑な構造のビジネス・プロセスを実行するには、まず次のファイルを作成する必要があります:

  • container.xsd

  • po.xsd

  • InvToPo.xsl

  • PoToPo.xsl

  • container.txt

container.xsdの内容

<schema xmlns="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://xmlns.oracle.com/pcbpel/demoSchema/container"
        xmlns:tns="http://xmlns.oracle.com/pcbpel/demoSchema/container"
        attributeFormDefault="qualified" elementFormDefault="qualified"
        xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd" nxsd:version="NXSD"
        nxsd:stream="chars">
        
  <element name="container" >
    <complexType>
      <choice maxOccurs="unbounded" nxsd:choiceCondition="fixedLength" nxsd:length="2">
        <element ref="tns:po" nxsd:conditionValue="PO"/>
        <element ref="tns:invoice" nxsd:conditionValue="IN"/>
      </choice>
    </complexType>
  </element>
  
  <element name="po" type="tns:poType"/>
  <element name="invoice" type="tns:invoiceType"/>
  
  <complexType name="poType">
    <sequence>
      <element name="header" type="tns:headerType"/>
      <element name="body" type="tns:bodyType"/>
      <element name="footer" type="tns:footerType"/>
    </sequence>
  </complexType>
  <complexType name="headerType">
    <sequence>
      <element name="date" type="dateTime" nxsd:style="fixedLength"
               nxsd:length="10" nxsd:padStyle="tail" nxsd:paddedBy=" "/>
      <element name="supplier" type="tns:poPartnerType"/>
      <element name="buyer" type="tns:poPartnerType"/>
    </sequence>
  </complexType>
  <complexType name="poPartnerType">
    <sequence>
      <element name="uid" type="string" nxsd:style="fixedLength" nxsd:length="7"
               nxsd:padStyle="tail" nxsd:paddedBy=" "/>
      <element name="name" type="string" nxsd:style="fixedLength"
               nxsd:length="10" nxsd:padStyle="tail" nxsd:paddedBy=" "/>
      <element name="address" type="tns:poAddressType"/>
    </sequence>
  </complexType>
  <complexType name="poAddressType">
    <sequence>
      <element name="street" type="string" nxsd:style="fixedLength"
               nxsd:length="25" nxsd:padStyle="tail" nxsd:paddedBy=" "/>
      <element name="city" type="string" nxsd:style="fixedLength"
               nxsd:length="15" nxsd:padStyle="tail" nxsd:paddedBy=" "/>
      <element name="zip" type="string" nxsd:style="fixedLength" nxsd:length="6"
               nxsd:padStyle="none"/>
      <element name="state" type="string" nxsd:style="terminated"
               nxsd:terminatedBy="${eol}"/>
    </sequence>
  </complexType>
  <complexType name="bodyType">
    <sequence>
      <element name="item" type="tns:itemType" maxOccurs="unbounded"
               nxsd:style="array" nxsd:cellSeparatedBy="${eol}"
               nxsd:arrayTerminatedBy="#"/>
    </sequence>
  </complexType>
  <complexType name="itemType">
    <sequence>
      <element name="uid" type="string" nxsd:style="fixedLength" nxsd:length="7"
               nxsd:padStyle="tail" nxsd:paddedBy=" "/>
      <element name="name" type="string" nxsd:style="fixedLength"
               nxsd:length="7" nxsd:padStyle="tail" nxsd:paddedBy=" "/>
      <element name="quantity" type="integer" nxsd:style="terminated"
               nxsd:terminatedBy=","/>
      <element name="price" type="double" nxsd:style="terminated"
               nxsd:terminatedBy=","/>
    </sequence>
  </complexType>
  <complexType name="footerType">
    <sequence>
      <element name="comment" type="string" nxsd:style="surrounded"
               nxsd:surroundedBy="${eol}"/>
    </sequence>
  </complexType>
  <complexType name="invoiceType">
    <sequence>
      <element name="purchaser" type="tns:partnerType"/>
      <element name="seller" type="tns:partnerType"/>
      <element name="line-item" type="tns:line-itemType" maxOccurs="unbounded"
               nxsd:style="array" nxsd:cellSeparatedBy="${eol}"
               nxsd:arrayTerminatedBy="#"/>
      <element name="total" type="double" nxsd:style="terminated"
               nxsd:terminatedBy="${eol}"/>
    </sequence>
  </complexType>
  <complexType name="partnerType">
    <sequence>
      <element name="uid" type="string" nxsd:style="fixedLength" nxsd:length="7"
               nxsd:padStyle="tail" nxsd:paddedBy=" "/>
      <element name="name" type="string" nxsd:style="surrounded"
               nxsd:surroundedBy="^"/>
      <element name="address" type="tns:addressType"/>
    </sequence>
  </complexType>
  <complexType name="addressType">
    <sequence>
      <element name="street1" type="string" nxsd:style="fixedLength"
               nxsd:length="15" nxsd:padStyle="tail" nxsd:paddedBy=" "/>
      <element name="street2" type="string" nxsd:style="fixedLength"
               nxsd:length="10" nxsd:padStyle="tail" nxsd:paddedBy=" "/>
      <element name="city" type="string" nxsd:style="fixedLength"
               nxsd:length="15" nxsd:padStyle="tail" nxsd:paddedBy=" "/>
      <element name="postal-code" type="string" nxsd:style="fixedLength"
               nxsd:length="5" nxsd:padStyle="none"/>
      <element name="country" type="string" nxsd:style="fixedLength"
               nxsd:length="2" nxsd:padStyle="none"/>
      <element name="state" type="string" nxsd:style="fixedLength"
               nxsd:length="2" nxsd:padStyle="none"/>
      <element name="phone" type="string" nxsd:style="terminated"
               nxsd:terminatedBy="${eol}"/>
    </sequence>
  </complexType>
  <complexType name="line-itemType">
    <sequence>
      <element name="uid" type="string" nxsd:style="fixedLength" nxsd:length="3"
               nxsd:padStyle="none"/>
      <element name="description" type="string" nxsd:style="surrounded"
               nxsd:surroundedBy="|"/>
      <element name="price" type="double" nxsd:style="terminated"
               nxsd:terminatedBy=","/>
      <element name="quantity" type="integer" nxsd:style="terminated"
               nxsd:terminatedBy=","/>
      <element name="line-total" type="double" nxsd:style="surrounded"
               nxsd:surroundedBy="+"/>
    </sequence>
  </complexType>
</schema>

po.xsdの内容

<schema attributeFormDefault="qualified" elementFormDefault="qualified"
        targetNamespace="http://xmlns.oracle.com/pcbpel/demoSchema/po"
        xmlns:pons="http://xmlns.oracle.com/pcbpel/demoSchema/po"
        xmlns="http://www.w3.org/2001/XMLSchema">
  <element name="po" type="pons:poType"/>
  <complexType name="poType">
    <sequence>
      <element name="header" type="pons:headerType"/>
      <element name="body" type="pons:bodyType"/>
      <element name="footer" type="pons:footerType"/>
    </sequence>
  </complexType>
  <complexType name="headerType">
    <sequence>
      <element name="date" type="dateTime"/>
      <element name="supplier" type="pons:poPartnerType"/>
      <element name="buyer" type="pons:poPartnerType"/>
    </sequence>
  </complexType>
  <complexType name="poPartnerType">
    <sequence>
      <element name="name" type="string"/>
      <element name="uid" type="string"/>
      <element name="address" type="pons:poAddressType"/>
    </sequence>
  </complexType>
  <complexType name="poAddressType">
    <sequence>
      <element name="street" type="string"/>
      <element name="city" type="string"/>
      <element name="zip" type="string"/>
      <element name="state" type="string"/>
    </sequence>
  </complexType>
  <complexType name="bodyType">
    <sequence>
      <element name="item" type="pons:itemType" maxOccurs="unbounded"/>
    </sequence>
  </complexType>
  <complexType name="itemType">
    <sequence>
      <element name="uid" type="string"/>
      <element name="name" type="string"/>
      <element name="price" type="double"/>
      <element name="quantity" type="integer"/>
    </sequence>
  </complexType>
  <complexType name="footerType">
    <sequence>
      <element name="comment" type="string"/>
    </sequence>
  </complexType>
</schema>

InvToPo.xslの内容

<?xml version="1.0" encoding="windows-1252"?>
<?oracle-xsl-mapper
  <!-- SPECIFICATION OF MAP SOURCES AND TARGETS, DO NOT MODIFY. -->
  <mapSources>
    <source type="XSD">
      <schema location="container.xsd"/>
      <rootElement name="container" namespace="http://xmlns.oracle.com/pcbpel/demoSchema/container"/>
    </source>
  </mapSources>
  <mapTargets>
    <target type="XSD">
      <schema location="po.xsd"/>
      <rootElement name="po" namespace="http://xmlns.oracle.com/pcbpel/demoSchema/po"/>
    </target>
  </mapTargets>
  <!-- GENERATED BY ORACLE XSL MAPPER 1.0 AT [FRI NOV 19 17:39:08 IST 2004]. -->
?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:tns="http://xmlns.oracle.com/pcbpel/demoSchema/container"
                xmlns:na0="http://www.w3.org/2001/XMLSchema"
                xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
                xmlns:pons="http://xmlns.oracle.com/pcbpel/demoSchema/po"
                exclude-result-prefixes="xsl tns na0 nxsd pons">
  <xsl:template match="/">
    <pons:po>
      <pons:header>
        <pons:supplier>
          <pons:name>
            <xsl:value-of select="/tns:container/tns:invoice/tns:seller/tns:name"/>
          </pons:name>
          <pons:uid>
            <xsl:value-of select="/tns:container/tns:invoice/tns:seller/tns:uid"/>
          </pons:uid>
          <pons:address>
            <pons:street>
              <xsl:value-of select="concat(/tns:container/tns:invoice/tns:seller/tns:address/tns:street1,/tns:container/tns:invoice/tns:seller/tns:address/tns:street2)"/>
            </pons:street>
            <pons:city>
              <xsl:value-of select="/tns:container/tns:invoice/tns:seller/tns:address/tns:city"/>
            </pons:city>
            <pons:zip>
              <xsl:value-of select="/tns:container/tns:invoice/tns:seller/tns:address/tns:postal-code"/>
            </pons:zip>
            <pons:state>
              <xsl:value-of select="/tns:container/tns:invoice/tns:seller/tns:address/tns:state"/>
            </pons:state>
          </pons:address>
        </pons:supplier>
        <pons:buyer>
          <pons:name>
            <xsl:value-of select="/tns:container/tns:invoice/tns:purchaser/tns:name"/>
          </pons:name>
          <pons:uid>
            <xsl:value-of select="/tns:container/tns:invoice/tns:purchaser/tns:uid"/>
          </pons:uid>
          <pons:address>
            <pons:street>
              <xsl:value-of select="concat(/tns:container/tns:invoice/tns:purchaser/tns:address/tns:street1,/tns:container/tns:invoice/tns:purchaser/tns:address/tns:street2)"/>
            </pons:street>
            <pons:city>
              <xsl:value-of select="/tns:container/tns:invoice/tns:purchaser/tns:address/tns:city"/>
            </pons:city>
            <pons:zip>
              <xsl:value-of select="/tns:container/tns:invoice/tns:purchaser/tns:address/tns:postal-code"/>
            </pons:zip>
            <pons:state>
              <xsl:value-of select="/tns:container/tns:invoice/tns:purchaser/tns:address/tns:state"/>
            </pons:state>
          </pons:address>
        </pons:buyer>
      </pons:header>
      <pons:body>
        <xsl:for-each select="/tns:container/tns:invoice/tns:line-item">
          <pons:item>
            <pons:uid>
              <xsl:value-of select="tns:uid"/>
            </pons:uid>
            <pons:name>
              <xsl:value-of select="tns:description"/>
            </pons:name>
            <pons:price>
              <xsl:value-of select="tns:price"/>
            </pons:price>
            <pons:quantity>
              <xsl:value-of select="tns:quantity"/>
            </pons:quantity>
          </pons:item>
        </xsl:for-each>
      </pons:body>
      <pons:footer>
        <pons:comment>
          The PO total is
          <xsl:value-of select="/tns:container/tns:invoice/tns:total"/>
        </pons:comment>
      </pons:footer>
    </pons:po>
  </xsl:template>
</xsl:stylesheet>

PoToPo.xslの内容

<?xml version="1.0" encoding="windows-1252"?>
<?oracle-xsl-mapper
  <!-- SPECIFICATION OF MAP SOURCES AND TARGETS, DO NOT MODIFY. -->
  <mapSources>
    <source type="XSD">
      <schema location="container.xsd"/>
      <rootElement name="container" namespace="http://xmlns.oracle.com/pcbpel/demoSchema/container"/>
    </source>
  </mapSources>
  <mapTargets>
    <target type="XSD">
      <schema location="po.xsd"/>
      <rootElement name="po" namespace="http://xmlns.oracle.com/pcbpel/demoSchema/po"/>
    </target>
  </mapTargets>
  <!-- GENERATED BY ORACLE XSL MAPPER 1.0 AT [FRI NOV 19 17:39:49 IST 2004]. -->
?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:tns="http://xmlns.oracle.com/pcbpel/demoSchema/container"
                xmlns:na0="http://www.w3.org/2001/XMLSchema"
                xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
                xmlns:pons="http://xmlns.oracle.com/pcbpel/demoSchema/po"
                exclude-result-prefixes="xsl tns na0 nxsd pons">
  <xsl:template match="/">
    <pons:po>
      <pons:header>
        <pons:date>
          <xsl:value-of select="/tns:container/tns:po/tns:header/tns:date"/>
        </pons:date>
        <pons:supplier>
          <pons:name>
            <xsl:value-of select="/tns:container/tns:po/tns:header/tns:supplier/tns:name"/>
          </pons:name>
          <pons:uid>
            <xsl:value-of select="/tns:container/tns:po/tns:header/tns:supplier/tns:uid"/>
          </pons:uid>
          <pons:address>
            <pons:street>
              <xsl:value-of select="/tns:container/tns:po/tns:header/tns:supplier/tns:address/tns:street"/>
            </pons:street>
            <pons:city>
              <xsl:value-of select="/tns:container/tns:po/tns:header/tns:supplier/tns:address/tns:city"/>
            </pons:city>
            <pons:zip>
              <xsl:value-of select="/tns:container/tns:po/tns:header/tns:supplier/tns:address/tns:zip"/>
            </pons:zip>
            <pons:state>
              <xsl:value-of select="/tns:container/tns:po/tns:header/tns:supplier/tns:address/tns:state"/>
            </pons:state>
          </pons:address>
        </pons:supplier>
        <pons:buyer>
          <pons:name>
            <xsl:value-of select="/tns:container/tns:po/tns:header/tns:buyer/tns:name"/>
          </pons:name>
          <pons:uid>
            <xsl:value-of select="/tns:container/tns:po/tns:header/tns:buyer/tns:uid"/>
          </pons:uid>
          <pons:address>
            <pons:street>
              <xsl:value-of select="/tns:container/tns:po/tns:header/tns:buyer/tns:address/tns:street"/>
            </pons:street>
            <pons:city>
              <xsl:value-of select="/tns:container/tns:po/tns:header/tns:buyer/tns:address/tns:city"/>
            </pons:city>
            <pons:zip>
              <xsl:value-of select="/tns:container/tns:po/tns:header/tns:buyer/tns:address/tns:zip"/>
            </pons:zip>
            <pons:state>
              <xsl:value-of select="/tns:container/tns:po/tns:header/tns:buyer/tns:address/tns:state"/>
            </pons:state>
          </pons:address>
        </pons:buyer>
      </pons:header>
      <pons:body>
        <xsl:for-each select="/tns:container/tns:po/tns:body/tns:item">
          <pons:item>
            <pons:uid>
              <xsl:value-of select="tns:uid"/>
            </pons:uid>
            <pons:name>
              <xsl:value-of select="tns:name"/>
            </pons:name>
            <pons:price>
              <xsl:value-of select="tns:price"/>
            </pons:price>
            <pons:quantity>
              <xsl:value-of select="tns:quantity"/>
            </pons:quantity>
          </pons:item>
        </xsl:for-each>
      </pons:body>
      <pons:footer>
        <pons:comment>
          <xsl:value-of select="/tns:container/tns:po/tns:footer/tns:comment"/>
        </pons:comment>
      </pons:footer>
    </pons:po>
  </xsl:template>
</xsl:stylesheet>

container.txtの内容

IN6335722^IBM India^First Street   999       San Jose       95129USCA650-801-6250
1234567^Oracle^Bridge Parkway 1600      Redwood Shores 94065USCA650-506-7000
001|BPEL Process Manager Enterprise Edition|20000,2,+40000+
002|BPEL Process Manager Standard Edition|10000,5,+50000+
003|BPEL Process Manager Developer Edition|1000,20,+20000+#110000
PO03/08/19784534001Oracle    Banerghatta Main Road    Bangalore      560029Karnataka
2234201IBM India Intermediate Ring Road   Bangalore      560037Karnataka
ORCL   SERVER 10,10000,#
ThankingYou
5.5.9.2 SOAコンポジットの設計

SOAコンポジットを含んだJDeveloperアプリケーションを作成する必要があります。使用例のアプリケーションとプロジェクトを作成するステップは、次のとおりです。

  1. JDeveloper「アプリケーション・ナビゲータ」で、「新規アプリケーション」をクリックします。「汎用アプリケーションの作成 - アプリケーションの名前付け」ページが表示されます。
  2. 「アプリケーション名」フィールドにSOA-FTPDebatchingと入力して「OK」をクリックします。「汎用アプリケーションの作成 - プロジェクトの名前付け」ページが表示されます。
  3. 「プロジェクト名」フィールドにFTPDebatchingと入力します。
  4. 「プロジェクト・テクノロジ」タブの「選択可能」リストで「SOA」をダブルクリックし、「選択済」リストに移動します。
  5. 「次へ」をクリックします。「SOA設定の構成」ダイアログが表示されます。
  6. 「コンポジット・テンプレート」ボックスで「BPELを使用するコンポジット」を選択して「終了」をクリックします。「BPELプロセスの作成 - BPELプロセス」ページが表示されます。
  7. 「名前」フィールドにBPELFTPDebatchingと入力し、「テンプレート」ボックスから「サービスを後で定義」を選択します。
  8. 「OK」をクリックします。図5-155に示すように、SOA-FTPDebatchingアプリケーションとFTPDebatchingプロジェクトが設計領域に表示されます。

    図5-155 JDeveloper - composite.xml

    図5-155の説明が続きます
    「図5-155 JDeveloper - composite.xml」の説明
  9. 作成したcontainer.xsdおよびpo.xsdファイル(「前提条件」を参照)をプロジェクトのxsdディレクトリにコピーします。
  10. 作成したInvToPo.xslおよびPoToPo.xslファイル(「前提条件」を参照)をプロジェクトのxslディレクトリにコピーします。
5.5.9.3 インバウンドのOracle FTPアダプタ・サービスの作成

ローカル・ディレクトリからファイルを読み取るインバウンドのOracle FTPアダプタ・サービスを作成するには、次のステップを実行します:

  1. Oracle FTPアダプタを、「コンポーネント」ウィンドウから「公開されたサービス」スイムレーンにドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
  2. 「サービス名」フィールドにFTPDebatchingInと入力します。
  3. 「次へ」をクリックします。次のステップを実行するページが表示されます。
  4. 「操作およびスキーマから定義(後で指定)」を選択して「次へ」をクリックします。「FTPサーバー接続」ページが表示されます。

    ノート:

    このアプリケーションをデプロイする前に、Oracle FTPアダプタのデプロイメント・ディスクリプタでjndi-nameが構成済であることを確認してください。

    図5-156 「アダプタ構成ウィザード - FTPサーバー接続」ページ

    図5-156の説明が続きます
    「図5-156 「アダプタ構成ウィザード - FTPサーバー接続」ページ」の説明
  5. 「次へ」をクリックします。「操作」ページが表示されます。
  6. 「ファイルの取得」を選択し、「次へ」をクリックします。「ファイル・ディレクトリ」ページが表示されます。

    図5-157 「アダプタ構成ウィザード - 操作」ページ

    図5-157の説明が続きます
    「図5-157 「アダプタ構成ウィザード - 操作」ページ」の説明
  7. 入力ディレクトリの物理パスを入力して「次へ」をクリックします。「ファイルのフィルタ処理」ページが表示されます。
  8. 「インクルード・ファイルの名前パターン」フィールドに*.txtと入力し、「ファイルが複数のメッセージを含む」チェック・ボックスを選択し、「バッチでメッセージをパブリッシュする数」ボックスの値として1を指定します。
  9. 「次へ」をクリックします。「ファイル・ポーリング」ページが表示されます。
  10. 「次へ」をクリックします。「メッセージ」ページが表示されます。
  11. 「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
  12. 「プロジェクトのスキーマ・ファイル」「container.xsd」および「container」を順番にクリックします。
  13. 「OK」をクリックします。「メッセージ」ページの「URL」フィールドにcontainer.xsdファイルが移入されます。
  14. 「次」をクリックします。
  15. 「JCAエンドポイント・プロパティ」画面で、「次」をクリックします。
    「参照構成」オプションを選択した場合、「JCAエンドポイント・プロパティ」画面が表示されます。詳細は、「アダプタ構成ウィザードのJCAエンドポイント・プロパティ」を参照してください。
  16. 「終了」をクリックします。インバウンドのOracleファイル・アダプタが構成され、composite.xmlが表示されます。

    図5-158 JDeveloper - composite.xml

    図5-158の説明が続きます
    「図5-158 JDeveloper - composite.xml」の説明
5.5.9.4 アウトバウンドのOracle FTPアダプタ・サービスの作成

ローカル・ディレクトリからFTPサーバーにファイルを書き込むアウトバウンドのOracle FTPアダプタ・サービスを作成するには、次のステップを実行します。

  1. 「コンポーネント」ウィンドウから「外部参照」スイムレーンにFTPアダプタをドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
  2. 「サービス名」フィールドにPurchaseOrderOutと入力します。
  3. 「次へ」をクリックします。「アダプタ・インタフェース」ページが表示されます。
  4. 「操作およびスキーマから定義(後で指定)」を選択して「次へ」をクリックします。「FTPサーバー接続」ページが表示されます。
  5. 「次へ」をクリックします。「操作」ページが表示されます。
  6. 「Put File」を選択して「次へ」をクリックします。「ファイル構成」ページが表示されます。
  7. 出力ディレクトリの物理パスを入力し、「ファイル・ネーミング規則(po_%SEQ%.txt)」フィールドにpo_%SEQ%.txtと入力します。
  8. 選択されていない場合は、「メッセージ数の到達」オプションを選択します。デフォルト値は、1です。
  9. 「次へ」をクリックします。「メッセージ」ページが表示されます。
  10. 「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
  11. 「プロジェクトのスキーマ・ファイル」「po.xsd」および「po」を順番にクリックします。
  12. 「OK」をクリックします。「メッセージ」ページの「URL」フィールドにpo.xsdファイルが移入されます。
  13. 「次」をクリックします。
  14. 「JCAエンドポイント・プロパティ」画面で、「次へ」をクリックします。
    参照構成オプションを選択した場合、「JCAエンドポイント・プロパティ」画面が表示されます。詳細は、「アダプタ構成ウィザードのJCAエンドポイント・プロパティ」を参照してください。
  15. 「終了」をクリックします。アウトバウンドのOracleファイル・アダプタが構成され、composite.xmlが表示されます。

    図5-159 JDeveloper - composite.xml

    図5-159の説明が続きます
    「図5-159 JDeveloper - composite.xml」の説明
5.5.9.5 サービスとアクティビティのワイヤリング

作成した3つのコンポーネント(インバウンド・アダプタ・サービス、BPELプロセス、アウトバウンド・アダプタ参照)をアセンブルまたは接続する必要があります。コンポーネントを接続するステップは、次のとおりです。

  1. 「公開されたサービス」領域にあるFTPDebatchingInサービス内の小さい三角形を、「コンポーネント」領域のBPELプロセス内に緑の三角形として表示されるドロップ・ゾーンにドラッグします。
  2. 「コンポーネント」領域にあるBPELプロセス内の小さい三角形を、「外部参照」領域のPurchaseOrderOut参照内に緑の三角形として表示されるドロップ・ゾーンにドラッグします。

    JDevelopercomposite.xml図5-160のように表示されます。

    図5-160 JDeveloper - composite.xml

    図5-160の説明が続きます
    「図5-160 JDeveloper - composite.xml」の説明
  3. 「ファイル」「すべて保存」を順番にクリックします。
5.5.9.5.1 receiveアクティビティの追加
  1. 「BPELFTPDebatching」をダブルクリックします。「BPELFTPDebatching.bpel」ページが表示されます。
  2. 「コンポーネント」ウィンドウから設計領域にreceiveアクティビティをドラッグ・アンド・ドロップします。
  3. receiveアクティビティをダブルクリックします。「Receive」ダイアログが表示されます。
  4. 「名前」フィールドにReceiveと入力します。
  5. 「パートナ・リンク」フィールドの端にある「パートナ・リンクの参照」をクリックします。「パートナ・リンク・チューザ」ダイアログが表示されます。
  6. 「FTPDebatchingIn」を選択して「OK」をクリックします。
  7. 「Receive」ダイアログで、「変数」フィールドの右にある「変数の自動作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。
  8. デフォルトの変数名を選択し、「OK」をクリックします。デフォルトの変数名が「変数」フィールドに移入されます。
  9. 「インスタンスの作成」を選択して、「OK」をクリックします。JDeveloper「BPELFTPDebatching.bpel」ページが表示されており、receiveアクティビティが追加されています。
5.5.9.5.2 invokeアクティビティの追加
  1. 「コンポーネント」ウィンドウから設計領域にinvokeアクティビティをドラッグ・アンド・ドロップします。
  2. invokeアクティビティをダブルクリックします。Invokeダイアログが表示されます。
  3. 「名前」フィールドにWriteと入力します。
  4. 「パートナ・リンク」フィールドの端にある「パートナ・リンクの参照」をクリックします。「パートナ・リンク・チューザ」ダイアログが表示されます。
  5. 「PurchaseOrderOut」を選択して「OK」をクリックします。
  6. 「Receive」ダイアログで、「入力変数」フィールドの右にある「入力変数の自動作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。
  7. 「変数」フィールドにWrite_Put_OutputVariableと入力し、「OK」をクリックします。Invokeダイアログが表示されます。
  8. 「OK」をクリックします。JDeveloper「BPELFTPDebatching.bpel」ページが表示されており、invokeアクティビティが追加されています。
5.5.9.5.3 switchアクティビティの追加
  1. 「コンポーネント」ウィンドウから設計領域のreceiveアクティビティとinvokeアクティビティの間にswitchアクティビティをドラッグ・アンド・ドロップします。

  2. switchアクティビティを開きます。これにより、<case>および<otherwise>の値を入力するための画面が表示されます。

  3. 図5-161に示すように、「<case>」セクションで「条件式の表示」アイコンをクリックします。「条件式」ポップアップ・ウィンドウが表示されます。

    図5-161 「BPELFTPDebatching.bpel」ページ

    図5-161の説明が続きます
    「図5-161 「BPELFTPDebatching.bpel」ページ」の説明
  4. ポップアップ・ウィンドウ内で「XPath式ビルダー」アイコンをクリックします。「式ビルダー」ダイアログが表示されます。

  5. 図5-162に示すように、式としてstarts-with(local-name(ora:getNodes('receive_Get_InputVariable','body','/ns3:container/child::*[position()=1]')),'invoice')を入力し、「OK」をクリックします。画面が「条件式」ポップアップ・ウィンドウに戻ります。

    図5-162 「式ビルダー」ダイアログ

    図5-162の説明が続きます
    「図5-162 「式ビルダー」ダイアログ」の説明
  6. 「<case>」セクションと「<otherwise>」セクションに1つずつ、2つのトランスフォーメーション・アクティビティを追加します。

    1. transformアクティビティを「<case>」セクションにドラッグ・アンド・ドロップします。

    2. transformアクティビティをダブルクリックします。

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

    4. 「トランスフォーメーション」タブをクリックします。

    5. 「作成」アイコンをクリックします。「ソース変数」ダイアログが表示されます。

    6. デフォルトを受け入れて「OK」をクリックします。

    7. 「ターゲット変数」リスト「Write_Put_OutputVariable」を選択します。

    8. 「マッパー・ファイル」フィールドの端にある「マッピングの参照」アイコンをクリックし、「InvToPo.xsl」ファイルを選択します。

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

    10. 同じプロセスを第2のトランスフォーメーションについて繰り返します。このtransformアクティビティの場合は、マッパー・ファイルとしてPoToPo.xslを選択します。

    図5-163に示すように、「BPELFTPDebatching.bpel」ページが表示されます。

    図5-163 「BPELFTPDebatching.bpel」ページ

    図5-163の説明が続きます
    「図5-163 「BPELFTPDebatching.bpel」ページ」の説明
  7. 「ファイル」「すべて保存」を順番にクリックします。

5.5.9.6 JDeveloperを使用したデプロイ

前述のステップで作成したSOAプロジェクトおよびアプリケーションについて、アプリケーション・プロファイルをデプロイする必要があります。JDeveloperを使用してアプリケーション・プロファイルをデプロイするには、次のステップを実行する必要があります。

  1. アプリケーション・サーバー接続を作成します。詳細は、「Oracle JCAアダプタ用のアプリケーション・サーバー接続の作成」を参照してください。
  2. アプリケーションをデプロイします。詳細は、「JDeveloperからのOracle JCAアダプタ・アプリケーションのデプロイ」を参照してください。
5.5.9.7 Oracle Fusion Middleware Controlコンソールを使用した監視

Fusion Middleware Controlコンソールを使用して、デプロイ済のSOAコンポジットを監視できます。次のステップを実行します。

  1. http://servername:portnumber/emにナビゲートします。デプロイしたコンポジットがアプリケーション・ナビゲータに表示されます。
  2. 作成したcontainer.txtファイル(「前提条件」を参照)を入力ディレクトリにコピーし、処理済であることを確認します。出力ディレクトリを調べて、出力ファイルが作成されていることを確認します。
  3. デプロイしたSOAコンポジットをクリックします。「ダッシュボード」が表示されます。

    「最新のインスタンス」領域で「インスタンスID」の値をノートにとります。

  4. 「インスタンス」タブをクリックします。SOAコンポジットのインスタンスIDがリスト表示されます。
  5. ステップ3でメモしたインスタンスIDをクリックします。「フローのトレース」ページが表示されます。
  6. BPELプロセス・インスタンスをクリックします。BPELプロセス・インスタンスの「監査証跡」が表示されます。
  7. ペイロード・ノードを開いてペイロード詳細を確認します。
  8. プロセス・フローを表示するには、「フロー」タブをクリックします。アクティビティをクリックして、アクティビティの詳細を表示します。

5.5.10 Oracle FTPアダプタの動的な同期読取り

この使用例では、invokeアクティビティを使用してプロセス途中の同期読取り操作を実行するOracle FTPアダプタの機能について説明します。この使用例で説明するアダプタ機能は、次のとおりです。

  • Oracleファイル・アダプタ(読取り操作)

  • Oracle FTPアダプタ(同期読取り操作)

    実行時に読取り対象のファイル名を指定する機能

  • Oracleファイル・アダプタ(書込み操作)

このプロセスは、インバウンドOracleファイル・アダプタによる監視対象のローカル・ディレクトリにファイルが存在することで開始されます。トリガー・ファイルには、同期読取り操作で読み取られるファイルの名前が含まれています。このファイル名は、ヘッダーを介してアダプタに渡されます。これを行うには、invokeアクティビティの「プロパティ」タブを使用します。この同期読取り操作は、FTPサーバー上のリモート・ディレクトリに対して実行されます。読取り結果は変換され、アウトバウンドOracleファイル・アダプタを介してローカル・ディレクトリに書き出されます。

この項には次のトピックが含まれます:

5.5.10.1 前提条件

FTPの動的な同期読取りを実行するには、まず次のファイルを作成する必要があります:

  • address-csv.xsd

  • address-fixedLength.xsd

  • trigger.xsd

  • addr1Toaddr2.xsl

  • address_csv.txt

  • trigger.trg

address-csv.xsdの内容

<?xml version="1.0" ?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
            targetNamespace="http://xmlns.oracle.com/pcbpel/demoSchema/csv"
            xmlns:tns="http://xmlns.oracle.com/pcbpel/demoSchema/csv"
            elementFormDefault="qualified"
            attributeFormDefault="unqualified" nxsd:encoding="US-ASCII" nxsd:hasHeader="true" nxsd:headerLines="1" nxsd:headerLinesTerminatedBy="${eol}" nxsd:stream="chars" nxsd:version="NXSD">
  <xsd:element name="Root-Element">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="Address" minOccurs="1" maxOccurs="unbounded">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="Name" type="xsd:string" nxsd:style="terminated" nxsd:terminatedBy="," nxsd:quotedBy="&quot;">
              </xsd:element>
              <xsd:element name="Street1" type="xsd:string" nxsd:style="terminated" nxsd:terminatedBy="," nxsd:quotedBy="&quot;">
              </xsd:element>
              <xsd:element name="Street2" type="xsd:string" nxsd:style="terminated" nxsd:terminatedBy="," nxsd:quotedBy="&quot;">
              </xsd:element>
              <xsd:element name="City" type="xsd:string" nxsd:style="terminated" nxsd:terminatedBy="," nxsd:quotedBy="&quot;">
              </xsd:element>
              <xsd:element name="State" type="xsd:string" nxsd:style="terminated" nxsd:terminatedBy="," nxsd:quotedBy="&quot;">
              </xsd:element>
              <xsd:element name="Country" type="xsd:string" nxsd:style="terminated" nxsd:terminatedBy="${eol}" nxsd:quotedBy="&quot;">
              </xsd:element>
            </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>
<!--NXSDWIZ:D:\work\jDevProjects\BPEL\FlatStructure\address-csv.txt:-->

address-fixedLength.xsdの内容

<?xml version="1.0" ?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
            targetNamespace="http://xmlns.oracle.com/pcbpel/demoSchema/fixedLength"
            xmlns:fix="http://xmlns.oracle.com/pcbpel/demoSchema/fixedLength"
            elementFormDefault="qualified"
            attributeFormDefault="unqualified" nxsd:encoding="US-ASCII" nxsd:stream="chars" nxsd:version="NXSD">
  <xsd:element name="Root-Element">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="Address" minOccurs="1" maxOccurs="unbounded" nxsd:style="array" nxsd:cellSeparatedBy="\r\n">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="Name" type="xsd:string" nxsd:style="fixedLength" nxsd:length="38">
              </xsd:element>
              <xsd:element name="Street" type="xsd:string" nxsd:style="fixedLength" nxsd:length="80">
              </xsd:element>
              <xsd:element name="City" type="xsd:string" nxsd:style="fixedLength" nxsd:length="11">
              </xsd:element>
              <xsd:element name="State" type="xsd:string" nxsd:style="fixedLength" nxsd:length="11">
              </xsd:element>
              <xsd:element name="Country" type="xsd:string" nxsd:style="fixedLength" nxsd:length="7">
              </xsd:element>
            </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>
<!--NXSDWIZ:C:\orabpel\samples\tutorials\121.FileAdapter\FlatStructure\outputDir\csv_2004.11.10.txt:-->

trigger.xsdの内容

<schema attributeFormDefault="qualified" elementFormDefault="qualified"
        targetNamespace="http://xmlns.oracle.com/DynamicSyncRead/Trigger"
	xmlns="http://www.w3.org/2001/XMLSchema">
  <element name="trigger">
    <complexType>
      <sequence>
       <element name="fileName" type="string"/>	
      </sequence> 
    </complexType>  
  </element>			
</schema>

addr1Toaddr2.xslの内容

<?xml version="1.0" encoding="UTF-8" ?>
<?oracle-xsl-mapper
  <!-- SPECIFICATION OF MAP SOURCES AND TARGETS, DO NOT MODIFY. -->
  <mapSources>
    <source type="XSD">
      <schema location="address-csv.xsd"/>
      <rootElement name="Root-Element" namespace="http://xmlns.oracle.com/pcbpel/demoSchema/csv"/>
    </source>
  </mapSources>
  <mapTargets>
    <target type="XSD">
      <schema location="address-fixedLength.xsd"/>
      <rootElement name="Root-Element" namespace="http://xmlns.oracle.com/pcbpel/demoSchema/fixedLength"/>
    </target>
  </mapTargets>
  <!-- GENERATED BY ORACLE XSL MAPPER 10.1.2.0.0(build 050422.0001) AT [THU MAY 12 14:50:41 IST 2005]. -->
?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://xmlns.oracle.com/pcbpel/demoSchema/csv" xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd" xmlns:fix="http://xmlns.oracle.com/pcbpel/demoSchema/fixedLength" xmlns:ldap="http://schemas.oracle.com/xpath/extension/ldap" xmlns:xp20="http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.Xpath20" xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/" xmlns:ora="http://schemas.oracle.com/xpath/extension" xmlns:orcl="http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.ExtFunc" exclude-result-prefixes="xsl xsd tns nxsd fix ldap xp20 bpws ora orcl">
  <xsl:template match="/">
    <fix:Root-Element>
      <xsl:for-each select="/tns:Root-Element/tns:Address">
        <fix:Address>
          <fix:Name>
            <xsl:value-of select="tns:Name"/>
          </fix:Name>
          <fix:Street>
            <xsl:value-of select="tns:Street1"/>
          </fix:Street>
          <fix:City>
            <xsl:value-of select="tns:City"/>
          </fix:City>
          <fix:State>
            <xsl:value-of select="tns:State"/>
          </fix:State>
          <fix:Country>
            <xsl:value-of select="tns:Country"/>
          </fix:Country>
        </fix:Address>
      </xsl:for-each>
    </fix:Root-Element>
  </xsl:template>
</xsl:stylesheet>

address_csv.txtの内容

Name,Street1,Street2,City,State,Country
Oracle India Private Limited, Lexington Towers Prestige St. John's Woods, 2nd Cross Road Chikka Audugodi, Bangalore, Karnataka, India
Intel Technology India Private Limited, Survey #23-56 P Devarabeesanahalli Village, Outer Ring Road Varthur Hobli, Bangalore, Karnataka, India

trigger.trgの内容

<trigger xmlns="http://xmlns.oracle.com/DynamicSyncRead/Trigger">
	<fileName>address_csv.txt</fileName>
</trigger>
5.5.10.2 SOAコンポジットの設計

SOAコンポジットを含んだJDeveloperアプリケーションを作成する必要があります。使用例のアプリケーションとプロジェクトを作成するステップは、次のとおりです。

  1. JDeveloper「アプリケーション・ナビゲータ」で、「新規アプリケーション」をクリックします。「汎用アプリケーションの作成 - アプリケーションの名前付け」ページが表示されます。
  2. 「アプリケーション名」フィールドにSOA-FTPDynamicSynchronousReadと入力して「OK」をクリックします。「汎用アプリケーションの作成 - プロジェクトの名前付け」ページが表示されます。
  3. 「プロジェクト名」フィールドにFTPDynamicSynchronousReadと入力します。
  4. 「プロジェクト・テクノロジ」タブの「選択可能」リストで「SOA」をダブルクリックし、「選択済」リストに移動します。
  5. 「次へ」をクリックします。「SOA設定の構成」ダイアログが表示されます。
  6. 「コンポジット・テンプレート」ボックスで「BPELを使用するコンポジット」を選択して「終了」をクリックします。「BPELプロセスの作成 - BPELプロセス」ページが表示されます。
  7. 「名前」フィールドにBPELDynamicSynchronousReadと入力し、「テンプレート」ボックスから「サービスを後で定義」を選択します。
  8. 「OK」をクリックします。図5-164に示すように、SOA-FTPDynamicSynchronousReadアプリケーションとFTPDynamicSynchronousReadプロジェクトが設計領域に表示されます。

    図5-164 JDeveloper - composite.xml

    図5-164の説明が続きます
    「図5-164 JDeveloper - composite.xml」の説明
  9. 作成したaddress-csv.xsdaddress-fixedLength.xsdおよびtrigger.xsdファイル(「前提条件」を参照)をプロジェクトのxsdディレクトリにコピーします。
  10. 作成したaddr1Toaddr2.xslファイル(「前提条件」を参照)をプロジェクトのxslディレクトリにコピーします。
5.5.10.3 インバウンドOracleファイル・アダプタ・サービスの作成

ローカル・ディレクトリからファイルを読み取るインバウンドのOracleファイル・アダプタ・サービスを作成するには、次のステップを実行します。

  1. 「コンポーネント」ウィンドウから「公開されたサービス」スイムレーンにファイル・アダプタをドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
  2. 「サービス名」フィールドにReadTriggerと入力します。
  3. 「次へ」をクリックします。「アダプタ・インタフェース」ページが表示されます。
  4. 「操作およびスキーマから定義(後で指定)」を選択して「次へ」をクリックします。
  5. 「FTPサーバー接続」画面で「FTPサーバーのJNDI名」に入力し、「次へ」をクリックします。
  6. 「Read File」を選択して「次へ」をクリックします。「ファイル・ディレクトリ」ページが表示されます。
  7. 入力ディレクトリの物理パスを入力して「次へ」をクリックします。「ファイルのフィルタ処理」ページが表示されます。
  8. 「インクルード・ファイルの名前パターン」フィールドに*.trgと入力して「次へ」をクリックします。「ファイル・ポーリング」ページが表示されます。
  9. 「次へ」をクリックします。「メッセージ」ページが表示されます。
  10. 「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
  11. 「プロジェクトのスキーマ・ファイル」「trigger.xsd」および「trigger」を順番にクリックします。
  12. 「OK」をクリックします。「メッセージ」ページの「URL」フィールドにtrigger.xsdファイルが移入されます。
  13. 「次」をクリックします。
  14. 「JCAエンドポイント・プロパティ」画面で、「次へ」をクリックします。
    参照構成オプションを選択した場合、「JCAエンドポイント・プロパティ」画面が表示されます。詳細は、「アダプタ構成ウィザードのJCAエンドポイント・プロパティ」を参照してください。
  15. 「終了」をクリックします。インバウンドのOracleファイル・アダプタが構成され、composite.xmlが表示されます。

    図5-165 JDeveloper - composite.xml

    図5-165の説明が続きます
    「図5-165 JDeveloper - composite.xml」の説明
5.5.10.4 アウトバウンドのOracle FTPアダプタ・サービスの作成

ローカル・ディレクトリからFTPサーバーにファイルを書き込むアウトバウンドのOracle FTPアダプタ・サービスを作成するには、次のステップを実行します。

  1. 「コンポーネント」ウィンドウから「外部参照」スイムレーンにFTPアダプタをドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
  2. 「サービス名」フィールドにSyncReadと入力します。
  3. 「次へ」をクリックします。「アダプタ・インタフェース」ページが表示されます。
  4. 「操作およびスキーマから定義(後で指定)」を選択して「次へ」をクリックします。「FTPサーバー接続」ページが表示されます。
  5. 「次へ」をクリックします。「操作」ページが表示されます。
  6. 「同期Get File」を選択して「次へ」をクリックします。「ファイル・ディレクトリ」ページが表示されます。
  7. 出力ディレクトリの物理パスを入力します。
  8. 「次へ」をクリックします。「ファイル名」ページが表示されます。
  9. 「ファイル名」フィールドにdummy.txtと入力して「次へ」をクリックします。「メッセージ」ページが表示されます。
  10. 「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
  11. 「プロジェクトのスキーマ・ファイル」「address-csv.xsd」および「Root-Element」を順番にクリックします。
  12. 「OK」をクリックします。「メッセージ」ページの「URL」フィールドにaddress-csv.xsdファイルが移入されます。
  13. 「次」をクリックします。
  14. 「終了」をクリックします。アウトバウンドのOracle FTPアダプタが構成され、composite.xmlが表示されます。

    図5-166 JDeveloper - composite.xml

    図5-166の説明が続きます
    「図5-166 JDeveloper - composite.xml」の説明
5.5.10.4.1 アウトバウンドOracleファイル・アダプタ・サービスの追加
  1. 「コンポーネント」ウィンドウから「外部参照」スイムレーンにOracleファイル・アダプタをドラッグ・アンド・ドロップします。アダプタ構成ウィザードの「ようこそ」ページが表示されます。
  2. 「次へ」をクリックします。「サービス名」ページが表示されます。
  3. 「サービス名」フィールドにWriteFileと入力します。
  4. 「次へ」をクリックします。「アダプタ・インタフェース」ページが表示されます。
  5. 「操作およびスキーマから定義(後で指定)」を選択して「次へ」をクリックします。「操作」ページが表示されます。
  6. 「Write File」を選択し、「操作名」フィールドにWriteと入力して「次へ」をクリックします。「ファイル構成」ページが表示されます。
  7. 出力ディレクトリの物理パスを入力し、「ファイル・ネーミング規則(po_%SEQ%.txt)」フィールドにaddress_%SEQ%.txtと入力します。
  8. 「次へ」をクリックします。「メッセージ」ページが表示されます。
  9. 「URL」フィールドの端に表示される「スキーマ・ファイルを参照」をクリックします。「タイプ・チューザ」ダイアログが表示されます。
  10. 「プロジェクトのスキーマ・ファイル」「address-fixedLength.xsd」および「Root-Element」を順番にクリックします。
  11. 「OK」をクリックします。「メッセージ」ページの「URL」フィールドにaddress-fixedLength.xsdファイルが移入されます。
  12. 「次へ」をクリックします。「終了」ページが表示されます。
  13. 「終了」をクリックします。図5-167に示すように、アウトバウンドOracleファイル・アダプタが構成され、composite.xmlが表示されます。

    図5-167 JDeveloper - composite.xml

    図5-167の説明が続きます
    「図5-167 JDeveloper - composite.xml」の説明
5.5.10.5 サービスとアクティビティのワイヤリング

作成した4つのコンポーネント(インバウンド・アダプタ・サービス、BPELプロセス、2つのアウトバウンド・アダプタ参照)をアセンブルまたは接続する必要があります。コンポーネントを接続するステップは、次のとおりです。

  1. 「公開されたサービス」領域にあるReadTrigger内の小さい三角形を、「コンポーネント」領域のBPELプロセス内に緑の三角形として表示されるドロップ・ゾーンにドラッグします。
  2. 「コンポーネント」領域にあるBPELプロセス内の小さい三角形を、「外部参照」領域のSyncRead内に緑の三角形として表示されるドロップ・ゾーンと、WriteFile内に緑の三角形として表示されるドロップ・ゾーンにドラッグします。

    JDevelopercomposite.xml図5-168のように表示されます。

    図5-168 JDeveloper - composite.xml

    図5-168の説明が続きます
    「図5-168 JDeveloper - composite.xml」の説明
  3. 「ファイル」「すべて保存」を順番にクリックします。
5.5.10.5.1 receiveアクティビティの追加
  1. 「BPELDynamicSynchronousRead」をダブルクリックします。「BPELDynamicSynchronousRead.bpel」ページが表示されます。
  2. 「コンポーネント」ウィンドウから設計領域にreceiveアクティビティをドラッグ・アンド・ドロップします。
  3. receiveアクティビティをダブルクリックします。「Receive」ダイアログが表示されます。
  4. 「名前」フィールドにReceiveTriggerと入力します。
  5. 「パートナ・リンク」フィールドの端にある「パートナ・リンクの参照」をクリックします。「パートナ・リンク・チューザ」ダイアログが表示されます。
  6. 「ReadTrigger」を選択して「OK」をクリックします。
  7. 「Receive」ダイアログで、「変数」フィールドの右にある「変数の自動作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。
  8. デフォルトの変数名を選択し、「OK」をクリックします。デフォルトの変数名が「変数」フィールドに移入されます。
  9. 「インスタンスの作成」を選択して、「OK」をクリックします。JDeveloper「BPELDynamicSynchronousRead.bpel」ページが表示されます。
5.5.10.5.2 変数の作成とinvokeアクティビティの追加
  1. (x)で表された「変数」アイコンをクリックします。「変数」ダイアログが表示されます。
  2. 「作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。
  3. 図5-169に示すように、xsd:stringタイプのfileという変数を作成します。

    図5-169 「変数の作成」ダイアログ

    図5-169の説明が続きます
    「図5-169 「変数の作成」ダイアログ」の説明
  4. 「OK」をクリックして「BPELDynamicSynchronousRead.bpel」ページに戻ります。
  5. 「コンポーネント」ウィンドウから設計領域にinvokeアクティビティをドラッグ・アンド・ドロップします。
  6. invokeアクティビティをダブルクリックします。Invokeダイアログが表示されます。
  7. 「名前」フィールドにInvoke_SyncReadと入力します。
  8. 「パートナ・リンク」フィールドの端にある「パートナ・リンクの参照」をクリックします。「パートナ・リンク・チューザ」ダイアログが表示されます。
  9. 「SyncRead」を選択して「OK」をクリックします。
  10. 「Invoke」ダイアログで、「入力変数」フィールドの右にある「入力変数の自動作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。
  11. デフォルトの変数名を選択し、「OK」をクリックします。「入力変数」フィールドにデフォルトの変数名が移入されます。
  12. 同じ手順を「出力変数」フィールドに対して繰り返します。
  13. 「プロパティ」タブをクリックします。プロパティおよび対応する値の列が表示されます。
  14. jca.ftp.FileNameプロパティを選択します。対応する値の列をダブルクリックします。「アダプタ・プロパティ値」ダイアログが表示されます。
  15. 「変数の参照」アイコンをクリックします。「変数XPathビルダー」ダイアログが表示されます。
  16. 「変数」を開いて「file」を選択し、「OK」をクリックします。jca.ftp.FileNameの値がfileに設定されます。
  17. 「OK」をクリックします。JDeveloper「BPELDynamicSynchronousRead.bpel」ページが表示されます。
5.5.10.5.3 別のinvokeアクティビティの追加
  1. 「コンポーネント」ウィンドウから設計領域にinvokeアクティビティをドラッグ・アンド・ドロップします。
  2. invokeアクティビティをダブルクリックします。「Invoke」ダイアログが表示されます。
  3. 「名前」フィールドにInvokeWriteと入力します。
  4. 「パートナ・リンク」フィールドの端にある「パートナ・リンクの参照」をクリックします。「パートナ・リンク・チューザ」ダイアログが表示されます。
  5. 「WriteFile」を選択して「OK」をクリックします。
  6. 「Invoke」ダイアログで、「入力変数」フィールドの右にある「入力変数の自動作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。
  7. デフォルトの変数名を選択し、「OK」をクリックします。デフォルトの変数名が「変数」フィールドに移入されます。
  8. 「OK」をクリックします。JDeveloperの「BPELDynamicSynchronousRead.bpel」ページが図5-170のように表示されます。

    図5-170 JDeveloper - 「BPELDynamicSynchronousRead.bpel」ページ

    図5-170の説明が続きます
    「図5-170 JDeveloper - 「BPELDynamicSynchronousRead.bpel」ページ」の説明
5.5.10.5.4 assignアクティビティの追加
  1. 「コンポーネント」ウィンドウから設計領域のReceiveTriggerアクティビティとInvoke_SyncReadアクティビティの間にassignアクティビティをドラッグ・アンド・ドロップします。
  2. assignアクティビティをダブルクリックします。Assignダイアログが表示されます。
  3. 「名前」フィールドにAssignFileNameと入力します。
  4. 「コピー操作」タブをクリックします。Assignダイアログが表示されます。
  5. 「コピー操作」を選択します。「コピー操作の作成」ダイアログが表示されます。
  6. 図5-171に示すように、トリガー・ファイル名とfile変数の間にコピー操作を作成します。

    図5-171 「コピー操作の作成」ダイアログ

    図5-171の説明が続きます
    「図5-171 「コピー操作の作成」ダイアログ」の説明
  7. 「コピー操作の作成」ダイアログで、「OK」をクリックします。
  8. 図5-172に示すように、「OK」をクリックしてJDeveloperの「BPELDynamicSynchronousRead.bpel」ページに戻ります。

    図5-172 JDeveloper - BPELDynamicSynchronousRead.bpel

    図5-172の説明が続きます
    「図5-172 JDeveloper - BPELDynamicSynchronousRead.bpel」の説明
  9. 「ファイル」「すべて保存」を順番にクリックします。
5.5.10.5.5 transformアクティビティの追加
  1. 「コンポーネント」ウィンドウから設計領域のInvoke_SyncReadアクティビティとInvokeWriteアクティビティの間にtransformアクティビティをドラッグ・アンド・ドロップします。
  2. transformアクティビティをダブルクリックします。「Transform」ダイアログが表示されます。
  3. 「名前」フィールドにTransformPayloadと入力します。
  4. 「トランスフォーメーション」タブをクリックします。「Transform」ダイアログが表示されます。
  5. 「作成」アイコンをクリックします。「ソース変数」ダイアログが表示されます。
  6. 「ソース変数」ボックスで「InvokeSyncRead_SyncRead_OutputVariable」を選択し、「ソース・パート」ボックスで「body」を選択して「OK」をクリックします。「ソース」と「パート」が選択された状態で「変換」ダイアログが表示されます。
  7. 「ターゲット変数」リストで「InvokeWrite_Write_InputVariable」を選択し、「ターゲット・パート」で「body」を選択します。
  8. 「マッパー・ファイル」フィールドの端にある「マッピングの参照」アイコンをクリックし、プロジェクトのxslディレクトリからaddr1Toaddr2.xslファイルを選択します。
  9. 「OK」をクリックします。
  10. 「ファイル」「すべて保存」を順番にクリックします。図5-173に示すように、「BPELDynamicSynchronousRead.bpel」ページが表示されます。

    図5-173 JDeveloper - BPELDynamicSynchronousRead.bpel

    図5-173の説明が続きます
    「図5-173 JDeveloper - BPELDynamicSynchronousRead.bpel」の説明
5.5.10.6 JDeveloperを使用したデプロイ

前述のステップで作成したSOAプロジェクトおよびアプリケーションについて、アプリケーション・プロファイルをデプロイする必要があります。JDeveloperを使用してアプリケーション・プロファイルをデプロイするには、次のステップを実行する必要があります。

  1. アプリケーション・サーバー接続を作成します。詳細は、「Oracle JCAアダプタ用のアプリケーション・サーバー接続の作成」を参照してください。
  2. アプリケーションをデプロイします。詳細は、「JDeveloperからのOracle JCAアダプタ・アプリケーションのデプロイ」を参照してください。
5.5.10.7 Oracle Fusion Middleware Controlコンソールを使用した監視

Fusion Middleware Controlコンソールを使用して、デプロイ済のSOAコンポジットを監視できます。次のステップを実行します。

  1. http://servername:portnumber/emにナビゲートします。デプロイしたコンポジットがアプリケーション・ナビゲータに表示されます。
  2. 作成したaddress-csv.txtファイル(「前提条件」を参照)を入力ディレクトリにコピーし、処理済であることを確認します。出力ディレクトリを調べて、出力ファイルが作成されていることを確認します。
  3. デプロイしたSOAコンポジットをクリックします。「ダッシュボード」が表示されます。

    「最新のインスタンス」領域で「インスタンスID」の値をノートにとります。

  4. 「インスタンス」タブをクリックします。SOAコンポジットのインスタンスIDがリスト表示されます。
  5. ステップ3でメモしたインスタンスIDをクリックします。「フローのトレース」ページが表示されます。
  6. BPELプロセス・インスタンスをクリックします。BPELプロセス・インスタンスの「監査証跡」が表示されます。
  7. ペイロード・ノードを開いてペイロード詳細を確認します。
  8. プロセス・フローを表示するには、「フロー」タブをクリックします。アクティビティをクリックして、アクティビティの詳細を表示します。
  9. 「ReceiveTrigger」をクリックしてアクティビティ詳細を表示します。

5.5.11 ファイルのコピー、移動および削除

Oracleファイル/FTPアダプタを使用すると、ある場所から別の場所にファイルをコピーまたは移動したり、ターゲット・ディレクトリからファイルを削除できます。さらに、Oracle FTPアダプタでは、ローカル・ファイル・システムとリモート・ファイル・システムの間でファイルをコピーまたは移動できます。この機能は、アウトバウンド・サービスの相互作用仕様として実装されます。そのため、BPELのinvokeアクティビティまたはメディエータのルーティング・ルールを使用してこの機能にアクセスできます。

高レベルでは、アウトバウンド・サービスを作成して、ソース・ディレクトリおよびターゲット・ディレクトリとファイル名を使用してこのサービスを構成する必要があります。

次の使用例では、アウトバウンド・サービスを使用してファイルをコピー、移動および削除できる、Oracleファイル/FTPアダプタがサポートする新機能について説明します。

5.5.11.1 ファイル・システムのローカル・ディレクトリから別のローカル・ディレクトリへのファイルの移動

ウィザードで実行できるのはこの手順の一部のみです。これは、該当するアダプタ構成ウィザードが使用可能でないためです。生成したJCAファイルを手動で構成することにより、残りの手順を完了してください。

ファイル・システムのローカル・ディレクトリから別のローカル・ディレクトリにファイルを移動するには、次のステップを実行します。

  1. 空のBPELプロセスを作成します。

  2. 「コンポーネント」ウィンドウから「外部参照」スイムレーンにファイル・アダプタをドラッグ・アンド・ドロップします。「アダプタ構成ウィザード - ようこそ」ページが表示されます。

  3. 「次へ」をクリックします。「サービス名」ページが表示されます。

  4. 「サービス名」フィールドにサービス名を入力します。

  5. 「次へ」をクリックします。「アダプタ・インタフェース」ページが表示されます。

  6. 「操作およびスキーマから定義(後で指定)」を選択して「次へ」をクリックします。「操作」ページが表示されます。

  7. 「同期Read File」を選択し、「操作名」フィールドにFileMoveと入力して「次へ」をクリックします。「ファイル・ディレクトリ」ページが表示されます。

    ノート:

    同期Read Fileを選択したのは、この操作の結果として生成されるWSDLファイルが、I/O操作に必要なファイルと同様のものであるためです。

  8. 着信ファイル用のディレクトリのダミー物理パスを入力し、「次へ」をクリックします。「ファイル名」ページが表示されます。

    ノート:

    このダミー・ディレクトリは使用されません。以降のステップでこのディレクトリを手動で変更する必要があります。

  9. ダミー・ファイル名を入力し、「次へ」をクリックします。「メッセージ」ページが表示されます。

    ノート:

    入力したダミー・ファイル名は使用されません。以降のステップでこのファイル名を手動で変更する必要があります。

  10. 「ネイティブ・フォーマット変換は不要(スキーマを不透明(Opaque)にする)」を選択し、「次へ」をクリックします。「終了」ページが表示されます。

  11. 「終了」をクリックします。これで、アウトバウンドOracleファイル・アダプタが構成されます。

  12. 「コンポーネント」領域にあるBPELプロセス内の小さい三角形を、「外部参照」領域のFileMove内に緑の三角形として表示されるドロップ・ゾーンにドラッグします。BPELコンポーネントがOracleファイル・アダプタのアウトバウンド・サービスに接続されます。

  13. デフォルト設定を選択して、先ほど作成したFileMoveサービスのinvokeアクティビティを作成します。

    次のステップでは、生成したWSDLファイルをMoveFileServiceサービス用に変更し、移動操作の新規の相互作用仕様で構成します。

  14. 次の例に示すように、FileMove_file.jcaファイルを開いてエンドポイント相互作用を変更します。

    JCAファイルは、ソース・ディレクトリおよびターゲット・ディレクトリとファイルの詳細を使用して構成する必要があります。ソース・ディレクトリおよびターゲット・ディレクトリとファイルの詳細は、JCAファイルでハードコードすることも、ヘッダー変数を使用して移入することもできます。この例では、ヘッダー変数が使用されています。

    例 - ソース・ディレクトリとターゲット・ディレクトリおよびファイルの詳細を含むJCAファイルの構成

    <adapter-config name="FileMove" adapter="File Adapter" xmlns="http://platform.integration.oracle/blocks/adapter/fw/metadata">
      <connection-factory location="eis/FileAdapter" adapterRef=""/>
      <endpoint-interaction portType="FileMove_ptt" operation="FileMove">
        <interaction-spec 
    className="oracle.tip.adapter.file.outbound.FileIoInteractionSpec">
          <property name="SourcePhysicalDirectory" value="foo1"/>
          <property name="SourceFileName" value="bar1"/>
          <property name="TargetPhysicalDirectory" value="foo2"/>
          <property name="TargetFileName" value="bar2"/>
          <property name="Type" value="MOVE"/>
        </interaction-spec>
      </endpoint-interaction>
    </adapter-config>
    

    ノート:

    className属性が変更され、SourcePhysicalDirectorySourceFileNameTargetPhysicalDirectoryTargetFileNameおよびTypeが追加されました。現在、ソースおよびターゲットの詳細の値はダミーです。これらは実行時に移入する必要があります。これらの値を特定のディレクトリまたはファイル名にハードコードすることもできます。

    Type属性によって操作のタイプが決まります。Type属性の許容値にはMOVEの他にCOPYDELETEがあります。

  15. 次の手順を実行して、実際のディレクトリ名とファイル名をソース・ファイルとターゲット・ファイルのパラメータにマッピングします。

    1. 適切な名前を付けた4つの文字列変数を作成します。ソース・ディレクトリおよびターゲット・ディレクトリの詳細にこれらの変数を移入する必要があります。BPELソース・ビューに次のように表示されます。

      <variables>
          <variable name="InvokeMoveOperation_FileMove_InputVariable" 
      messageType="ns1:Empty_msg"/>
          <variable name="InvokeMoveOperation_FileMove_OutputVariable" 
      messageType="ns1:FileMove_msg"/>
          <variable name="sourceDirectory" type="xsd:string"/>
          <variable name="sourceFileName" type="xsd:string"/>
          <variable name="targetDirectory" type="xsd:string"/>
          <variable name="targetFileName" type="xsd:string"/>
        </variables>
      
    2. assignアクティビティを作成し、sourceDirectorysourceFileNametargetDirectoryおよびtargetFileName変数に値を割り当てます。この割当て操作は、BPELソース・ビューに次の例のように表示されます。

      例 - 値を割り当てるためのassignアクティビティの作成

      <assign name="AssignFileDetails">
            <copy>
              <from expression="'/home/alex'"/>
              <to variable="sourceDirectory"/>
            </copy>
            <copy>
              <from expression="'input.txt'"/>
              <to variable="sourceFileName"/>
            </copy>
            <copy>
              <from expression="'/home/alex'"/>
              <to variable="targetDirectory"/>
            </copy>
            <copy>
              <from expression="'output.txt'"/>
              <to variable="targetFileName"/>
            </copy>
          </assign>
      

      この例では、/home/alexから/home/alex内のoutput.txtinput.txtが移動されます。

      ノート:

      この例では、ソースおよびターゲットの詳細がハードコードされています。これらの詳細は、ランタイム・パラメータとして指定することもできます。

    3. これらのパラメータをヘッダーとして起動操作に渡します。これらの変数値によってJCAファイルのパラメータがオーバーライドされます。

      例 - パラメータをヘッダーとして起動操作に渡す方法

      <bpelx:toProperties>
            <bpelx:toProperty name="jca.file.SourceDirectory" variable="sourceDirectory"/>
            <bpelx:toProperty name="jca.file.SourceFileName" variable="sourceFile"/>
            <bpelx:toProperty name="jca.file.TargetDirectory" variable="destinationDirectory"/>
            <bpelx:toProperty name="jca.file.TargetFileName" variable="destinationFile"/>
      				<bpelx:toProperty name="jca.jndi" variable="jndiLocation"/>
          </bpelx:toProperties>
      
  16. 最後に、最初のreceiveまたはpickアクティビティを追加します。

    ファイル・システムのローカル・ディレクトリから別のローカル・ディレクトリへのファイルの移動が完了しました。

5.5.11.2 ファイル・システムのローカル・ディレクトリから別のローカル・ディレクトリへのファイルのコピー

ファイル・システムのローカル・ディレクトリから別のローカル・ディレクトリにファイルをコピーするには、次の手順を実行します。

  1. 「ファイル・システムのローカル・ディレクトリから別のローカル・ディレクトリへのファイルの移動」のステップ1から12に従います。
  2. 次の例に示すように、「ファイル・システムのローカル・ディレクトリから別のローカル・ディレクトリへのファイルの移動」のステップ14で、エンドポイント相互作用のTYPE属性の値をMOVEからCOPYに変更します。

    例 - Typeプロパティ名の値をCopyに変更

    <adapter-config ...>
      <connection-factory .../>
      <endpoint-interaction ...>
        <interaction-spec 
    className="oracle.tip.adapter.file.outbound.FileIoInteractionSpec">
          <property .../>
          <property name="Type" value="COPY"/>
        </interaction-spec>
      </endpoint-interaction>
    </adapter-config>
    
5.5.11.3 ローカル・ファイル・システム・ディレクトリからのファイルの削除

ファイルを削除するには、TargetPhysicalDirectoryおよびTargetFileNameパラメータが必要です。

ノート:

ローカル・ファイル・システム・ディレクトリからファイルを削除する場合、SourcePhysicalDirectoryおよびSourceFileNameは必要ありません。

ファイル(delete_me.txt)を/home/alexディレクトリから削除するには、次のステップを実行します:

  1. 「ファイル・システムのローカル・ディレクトリから別のローカル・ディレクトリへのファイルの移動」のステップ1から12に従います。
  2. 次の例に示すように、「ファイル・システムのローカル・ディレクトリから別のローカル・ディレクトリへのファイルの移動」のステップ14で、エンドポイント相互作用のTYPE属性の値をDELETEに変更します。

    例 - TYPE属性の値をDELETEに変更

    <adapter-config name="FileDelete" adapter="File Adapter" 
    xmlns="http://platform.integration.oracle/blocks/adapter/fw/metadata">
      <connection-factory location="eis/FileAdapter" adapterRef=""/>
      <endpoint-interaction portType="FileDelete_ptt" operation="FileDelete">
        <interaction-spec 
    className="oracle.tip.adapter.file.outbound.FileIoInteractionSpec">
          <property name="TargetPhysicalDirectory" value="/home/alex"/>
          <property name="TargetFileName" value="delete_me.txt"/>
          <property name="Type" value="DELETE"/>
        </interaction-spec>
      </endpoint-interaction>
    </adapter-config>
    
5.5.11.4 あるリモート・ディレクトリから同じFTPサーバーの別のリモート・ディレクトリへのファイルの移動

Oracle FTPアダプタのI/Oの使用例は、Oracleファイル・アダプタの使用例とよく似ています。ただし、注意が必要な微妙な相違点がいくつかあります。

この使用例では、同じディレクトリ内にファイルを移動しますが、これは、同じサーバー上での名前の変更操作に似ています。ほとんどのFTPサーバーは、FTPサーバーでのファイルの名前変更を行うRNFR/RNTOのFTPコマンドをサポートしています。

ただし、RNFR/RNTOコマンドをサポートしていない場合でも、バインディング・プロパティUseNativeRenameOperationを使用すれば同じディレクトリ内にファイルを移動できます。デフォルトでは、このプロパティはTRUEに設定されています。その場合は、Oracle FTPアダプタでネイティブのRNFR/RNTOコマンドが使用されます。ただし、このプロパティをFALSEに設定すると、移動操作をエミュレートするためにGetコマンドとPutコマンド、さらにDeleteコマンドがOracle FTPアダプタで使用されます。

ウィザードで実行できるのはこの手順の一部のみです。これは、該当するアダプタ構成ウィザードが使用可能でないためです。生成したJCAファイルを手動で構成することにより、残りの手順を完了してください。

リモート・ディレクトリから同じFTPサーバーの別のリモート・ディレクトリにファイルを移動するには、次のステップを実行します。

  1. 空のBPELプロセスを作成します。

  2. 「コンポーネント」ウィンドウから「外部参照」スイムレーンにFTPアダプタをドラッグ・アンド・ドロップします。「アダプタ構成ウィザード - ようこそ」ページが表示されます。

  3. 「次へ」をクリックします。「サービス名」ページが表示されます。

  4. 「サービス名」フィールドにサービス名を入力します。

  5. 「次へ」をクリックします。「アダプタ・インタフェース」ページが表示されます。

  6. 「次へ」をクリックします。「FTPサーバー接続」ページが表示されます。

  7. FTPサーバーのJNDI名を入力して「次へ」をクリックします。「操作」ページが表示されます。

  8. 「同期Get File」を選択し、「操作名」フィールドにFTPMoveと入力して「次へ」をクリックします。「ファイル・ディレクトリ」ページが表示されます。

    ノート:

    同期Get Fileを選択したのは、この操作の結果として生成されるWSDLファイルが、I/O操作に必要なファイルと同様のものであるためです。

  9. 着信ファイル用のディレクトリのダミー物理パスを入力し、「次へ」をクリックします。「ファイル名」ページが表示されます。

    ノート:

    このダミー・ディレクトリは使用されません。以降のステップでこのディレクトリを手動で変更する必要があります。

  10. ダミー・ファイル名を入力し、「次へ」をクリックします。「ファイル名」ページが表示されます。

    ノート:

    入力したダミー・ファイル名は使用されません。以降のステップでこのファイル名を手動で変更する必要があります。

  11. 「次へ」をクリックします。「メッセージ」ページが表示されます。

  12. 「ネイティブ・フォーマット変換は不要(スキーマを不透明(Opaque)にする)」を選択し、「次へ」をクリックします。「終了」ページが表示されます。

  13. 「終了」をクリックします。これで、アウトバウンドOracleファイル・アダプタが構成されます。

  14. 「コンポーネント」領域にあるBPELプロセス内の小さい三角形を、「外部参照」領域のFTPMove内に緑の三角形として表示されるドロップ・ゾーンにドラッグします。BPELコンポーネントがOracle FTPアダプタのアウトバウンド・サービスに接続されます。

  15. 「ファイル」「すべて保存」を順番にクリックします。

  16. 先ほど作成したFTPMoveサービスのinvokeアクティビティを作成します。

    次のステップでは、生成したWSDLファイルをFTPMoveサービス用に変更し、移動操作の新規の相互作用仕様で構成します。

  17. 次の例に示すように、FTPMove_ftp.jcaファイルを開いてinteraction-specを変更します。

    JCAファイルは、ソース・ディレクトリおよびターゲット・ディレクトリとファイルの詳細を使用して構成する必要があります。ソース・ディレクトリおよびターゲット・ディレクトリとファイルの詳細は、JCAファイルでハードコードすることも、ヘッダー変数を使用して移入することもできます。

    この例では、ヘッダー変数が使用されています。

    例 - 移動操作のためのjcaファイルのinteraction-spec部分の変更

    <adapter-config name="FTPMove" adapter="Ftp Adapter" 
    xmlns="http://platform.integration.oracle/blocks/adapter/fw/metadata">
     
      <connection-factory location="eis/Ftp/FtpAdapter" adapterRef=""/>
      <endpoint-interaction portType="FTPMove_ptt" operation="FTPMove">
        <interaction-spec 
    className="oracle.tip.adapter.ftp.outbound.FTPIoInteractionSpec">
          <property name="SourcePhysicalDirectory" value="foo1"/>
          <property name="SourceFileName" value="bar1"/>
          <property name="TargetPhysicalDirectory" value="foo2"/>
          <property name="TargetFileName" value="bar2"/>
          <property name="Type" value="MOVE"/>
        </interaction-spec>
      </endpoint-interaction>
     
    </adapter-config>
    

    ノート:

    className属性が変更され、SourcePhysicalDirectorySourceFileName TargetPhysicalDirectoryTargetFileName,およびTypeが追加されました。現在、ソースおよびターゲットの詳細の値はダミーです。これらは実行時に移入する必要があります。これらの値を特定のディレクトリまたはファイル名にハードコードすることもできます。

    Type属性によって操作のタイプが決まります。Type属性の許容値にはMOVEの他にCOPYDELETEがあります。

  18. 次の手順を実行して、実際のディレクトリ名とファイル名をソース・ファイルとターゲット・ファイルのパラメータにマッピングします。

    1. 適切な名前を付けた4つの文字列変数を作成します。ソース・ディレクトリおよびターゲット・ディレクトリの詳細にこれらの変数を移入する必要があります。BPELソース・ビューに次のように表示されます。

        <variables>
          <variable name="InvokeMoveOperation_FileMove_InputVariable" 
      messageType="ns1:Empty_msg"/>
          <variable name="InvokeMoveOperation_FileMove_OutputVariable" 
      messageType="ns1:FileMove_msg"/>
          <variable name="sourceDirectory" type="xsd:string"/>
          <variable name="sourceFileName" type="xsd:string"/>
          <variable name="targetDirectory" type="xsd:string"/>
          <variable name="targetFileName" type="xsd:string"/>
        </variables>
      
    2. assignアクティビティを作成し、sourceDirectorysourceFileNametargetDirectoryおよびtargetFileName変数に値を割り当てます。この割当て操作は、BPELソース・ビューに次の例のように表示されます。

      例 - assignアクティビティの作成

          <assign name="AssignFTPFileDetails">
            <copy>
              <from expression="'/home/ftp'"/>
              <to variable="sourceDirectory"/>
            </copy>
            <copy>
              <from expression="'input.txt'"/>
              <to variable="sourceFileName"/>
            </copy>
            <copy>
              <from expression="'/home/ftp/out'"/>
              <to variable="targetDirectory"/>
            </copy>
            <copy>
              <from expression="'output.txt'"/>
              <to variable="targetFileName"/>
            </copy>
          </assign>
      

      この例では、input.txt/home/ftp から/home/ftp/out内のoutput.txtに移動または名前変更されます。

      ノート:

      この例では、ソースおよびターゲットの詳細がハードコードされています。これらの詳細は、ランタイム・パラメータとして指定することもできます。

    3. これらのパラメータをヘッダーとして起動操作に渡します。これらの変数値によってJCAファイルのパラメータがオーバーライドされます。

      例 - パラメータをヘッダーとして起動操作に渡す方法

      <invoke name="InvokeRenameService"
      inputVariable="InvokeRenameService_RenameFile_InputVariable"
      partnerLink="RenameFTPFile" portType="ns2:RenameFile_ptt"
      operation="RenameFile">
      <bpelx:inputProperty name="jca.file.SourceDirectory" 
      variable="returnDirectory"/>
      <bpelx:inputProperty name="jca.file.SourceFileName" 
      variable="returnFile"/>
      <bpelx:inputProperty name="jca.file.TargetDirectory" 
      variable="returnDirectory"/>
      <bpelx:inputProperty name="jca.file.TargetFileName" 
      variable="targetFile"/>
      </invoke>
      
  19. 最後に、最初のreceiveまたはpickアクティビティを追加します。

    リモート・ディレクトリから同じFTPサーバーの別のリモート・ディレクトリへのファイルの移動または名前変更が完了しました。

ノート:

FTPサーバーがRNFR/RNTOのFTPコマンドをサポートしていない場合は、次の例に示すように、UseNativeRenameOperationFALSEに設定し、composite.xmlでプロパティを定義する必要があります。

<reference name="FTPMove" ui:wsdlLocation="FTPMove.wsdl">
  <interface.wsdl interface="http://xmlns.oracle.com/pcbpel
    /adapter/ftp/SOAFtpIO/SOAFtpIO/
          FTPMove/#wsdl.interface(FTPMove_ptt)"/>
    <binding.jca config="FTPMove_ftp.jca">
      <property name="UseNativeRenameOperation" 
         type="xs:string" many="false" override="may">false</property>
    </binding.jca>
</reference>
5.5.11.5 ファイル・システムのローカル・ディレクトリからFTPサーバーのリモート・ディレクトリへのファイルの移動

この使用例のステップは「あるリモート・ディレクトリから同じFTPサーバーの別のリモート・ディレクトリへのファイルの移動」の使用例と同じです。ただし、ソース・ディレクトリをローカルとして、ターゲット・ディレクトリをリモートとして構成する必要があります。

次の例に示すように、SourceIsRemoteおよびTargetIsRemoteプロパティを使用して、ソース・ファイルおよびターゲット・ファイルをローカル・ファイル・システムまたはリモート・ファイル・システムのいずれに置くかを指定します。

例 - SourceIsRemoteおよびTargetIsRemoteプロパティの使用

<adapter-config name="FTPMove" adapter="Ftp Adapter" 
xmlns="http://platform.integration.oracle/
                   blocks/adapter/fw/metadata">
  <connection-factory location="eis/Ftp/FtpAdapter" 
                           adapterRef=""/>
  <endpoint-interaction portType="FTPMove_ptt" 
                         operation="FTPMove">
    <interaction-spec 
className="oracle.tip.adapter.ftp.outbound.FTPIoInteractionSpec">
      <property name="SourcePhysicalDirectory" value="foo1"/>
      <property name="SourceFileName" value="bar1"/>
      <property name="SourceIsRemote" value="false"/>
      <property name="TargetPhysicalDirectory" value="foo2"/>
      <property name="TargetFileName" value="bar2"/>
      <property name="Type" value="MOVE"/>
    </interaction-spec>
  </endpoint-interaction>
 
</adapter-config>

ノート:

この例では、SourceIsRemotefalseとして構成されています。この場合、FTPの入出力操作では、ソース・ファイルをローカル・ファイル・システムから取得するものと仮定します。また、ターゲットに対するパラメータは指定しませんでした。これは、デフォルトでTargetIsRemotetrueに設定されているためです。

5.5.11.6 FTPサーバーのリモート・ディレクトリからファイル・システムのローカル・ディレクトリへのファイルの移動

この使用例のステップは「ファイル・システムのローカル・ディレクトリからFTPサーバーのリモート・ディレクトリへのファイルの移動」の使用例と同じです。ただし、次の例に示すように、ソース・ディレクトリをリモートとして、ターゲット・ディレクトリをローカルとして構成する必要があります。

例 - リモートとしてソース・ディレクトリ、ローカルとしてターゲット・ディレクトリを構成

<adapter-config name="FTPMove" adapter="Ftp Adapter" 
xmlns="http://platform.integration.oracle
                 /blocks/adapter/fw/metadata">
  <connection-factory location="eis/Ftp/FtpAdapter" 
                adapterRef=""/>
  <endpoint-interaction portType="FTPMove_ptt" 
                      operation="FTPMove">
    <interaction-spec 
className="oracle.tip.adapter.ftp.outbound.FTPIoInteractionSpec">
      <property name="SourcePhysicalDirectory" value="foo1"/>
      <property name="SourceFileName" value="bar1"/>
      <property name="TargetPhysicalDirectory" value="foo2"/>
      <property name="TargetFileName" value="bar2"/>
      <property name="TargetIsRemote" value="false"/>
      <property name="Type" value="MOVE"/>
    </interaction-spec>
  </endpoint-interaction>
 
</adapter-config>

ノート:

この例では、TargetIsRemotefalseとして構成されています。この場合、FTPのI/Oでは、ソース・ファイルはリモート・ファイル・システムから取得するが、ターゲット・ファイルはローカル・ファイル・システム上にあると仮定します。また、ソースに対するパラメータは指定しませんでした。これは、デフォルトでSourceIsRemoteがtrueに設定されているためです。

5.5.11.7 あるFTPサーバーから別のFTPサーバーへのファイルの移動

あるFTPサーバーから別のFTPサーバーにファイルを移動するには、次の項に記載されている使用例を順に実行する必要があります。

  1. 「FTPサーバーのリモート・ディレクトリからファイル・システムのローカル・ディレクトリへのファイルの移動」: ローカル・ディレクトリから別のFTPサーバーにファイルをアップロード

  2. 「ファイル・システムのローカル・ディレクトリからFTPサーバーのリモート・ディレクトリへのファイルの移動」: FTPサーバーからローカル・ディレクトリにファイルをダウンロード

5.5.12 ファイル・アダプタを使用した同期BPELコンポジットの作成

デフォルトでは、テクノロジ・アダプタを使用すると、JDeveloperアダプタ・ウィザードによって非同期WSDLが生成されます。通常、11gでアダプタ・シナリオを作成する場合は、次のステップに従います。

  1. 「BPELを使用するコンポジット」または「空のコンポジット」を選択して、SOAアプリケーションを作成します。「空のコンポジット」を選択した場合は、「サービス・コンポーネント」ペインから「SOAコンポジット・エディタ」にBPELプロセスをドロップする必要があります。

    図5-174に示す画面が表示されたら、この画面でプロセス詳細を入力します。テンプレートとして「サービスを後で定義」を選択する必要があります。

    図5-174 プロセス作成画面

    図5-174の説明が続きます
    「図5-174 プロセス作成画面」の説明
  2. 次に、インバウンド・サービスおよびアウトバウンド参照を作成し、それらをBPELコンポーネントと接続します。

    図5-175 インバウンド・サービスおよびアウトバウンド参照の作成

    図5-175の説明が続きます
    「図5-175 インバウンド・サービスおよびアウトバウンド参照の作成」の説明
  3. 最後に、ペイロード取得用の開始<receive>アクティビティおよびペイロード書込み用の<invoke>アクティビティを含むBPELプロセスを作成します。

    図5-176 receiveアクティビティとinvokeアクティビティ

    図5-176の説明が続きます
    「図5-176 receiveアクティビティとinvokeアクティビティ」の説明

アダプタを使用するほとんどのBPELプロセスは、この方法でモデル化されます。生成されたWSDLは一方向的であることを示しており、これによりBPELプロセスは非同期的になります。

図5-177 生成された一方向WSDL

図5-177の説明が続きます
「図5-177 生成された一方向WSDL」の説明

つまり、インバウンド・ファイル・アダプタによりディレクトリ内のファイルをポーリングし、そこで見つかった各ファイルについて、コンテンツをXMLに変換してBPELにパブリッシュします。

ただし、BPELプロセスが非同期的であるため、ファイル・アダプタがパブリッシュ後すぐに戻されて、必要な後処理、たとえば、データの削除やアーカイブが実行されます。

このような非同期BPELプロセスの短所は、インバウンド・アダプタの調整が難しくなる点です。つまり、ダウンストリームのビジネス・プロセスで処理が完了するのを待機せずに、インバウンド・アダプタによってBPELにメッセージが送信され続けます。この結果、メモリー使用量の増加やCPU使用率の上昇などの問題が発生する可能性があります。

これらの問題の発生を抑制するため、WSDLおよびBPELのアーティファクトを同期プロセスに手動で変更できます。同期BPELプロセスに変更したら、インバウンド・ファイル・アダプタでは、次のファイルまたはメッセージを処理する前に<reply>でダウンストリーム・プロセスによる処理が完了するまで強制的に待機するようになり、結果的にファイル・アダプタが自動的に調整されます。

図5-178に示されている、変更されたWSDLを参照してください。ここでは、一方向のWSDLを双方向のWSDLに変換することによって、WSDLを同期的にしています。

図5-178 双方向のWSDLに変更された非同期WSDL

図5-178の説明が続きます
「図5-178 双方向のWSDLに変更された非同期WSDL」の説明

次のステップでは、BPELプロセスの最後にあるインバウンド・アダプタのパートナ・リンクに<reply>アクティビティを追加します。たとえば:

図5-179 インバウンド・アダプタへのReplyの指定

図5-179の説明が続きます
「図5-179 インバウンド・アダプタへのReplyの指定」の説明

最終的なプロセスは図5-180のようになります。

図5-180 ReceiveおよびReply BPELアクティビティを含む同期ファイル・アダプタ・プロセス

図5-180の説明が続きます
「図5-180 ReceiveおよびReply BPELアクティビティを含む同期ファイル・アダプタ・プロセス」の説明

デフォルトではメディエータのルーティング・ルールは順次であるため、このタイプの作業はメディエータでは不要です。つまり、メディエータでは、ルーティング・ルールの処理にコール元のスレッド(インバウンド・ファイル・アダプタのスレッド)が使用されます。メディエータのWSDLが一方向でもこれは当てはまります。

5.5.12.1 FTPアダプタでのコネクション・ファクトリJNDIの動的な変更

5つの異なるFTPサーバーに同じファイルを送信する必要がある場合、たとえば、各コネクション・ファクトリの位置に1つずつ、合計5つのFtpAdapter参照を作成できます。ただし、これは最適な方法ではないため、かわりに動的パートナ・リンクという概念を使用できます。

アダプタを管理モードで実行している場合、FtpAdapterのWebLogic Serverコンソールでコネクション・ファクトリJNDIを構成する必要があります。

図5-181の例では、localhost上で実行されているFTPサーバーにコネクション・ファクトリJNDIの位置eis/Ftp/FtpAdapterがマッピングされています。

図5-181 localhost上で実行されているFTPサーバーにマッピングされたコネクション・ファクトリのJNDIの位置 - weblogic.raのサンプル

図5-181の説明が続きます
「図5-181 localhost上で実行されているFTPサーバーにマッピングされたコネクション・ファクトリのJNDIの位置 - weblogic.raのサンプル」の説明

図5-182 FTPアダプタのマッピングを示すコネクション・ファクトリ

図5-182の説明が続きます
「図5-182 FTPアダプタのマッピングを示すコネクション・ファクトリ」の説明

アプリケーション・サーバーでコネクション・ファクトリを構成した後は、SCAプロセスのjcaアーティファクトでそのコネクション・ファクトリのJNDIを参照する必要があります。例では、.jcaファイル内のFTPOut参照で、eis/Ftp/FtpAdapterに対応するFTPサーバーが使用されています。

BPELおよびメディエータ・サービス・エンジンの両方のJCAヘッダー・プロパティを使用すると、このコネクション・ファクトリの位置を動的に変更できます。このためには、図5-183に示すように、BPELまたはメディエータを使用するビジネス・シナリオで予約済のJCAヘッダー・プロパティjca.jndiを使用する必要があります。

図5-183 予約済JCAヘッダー・プロパティjca.jndiの使用

図5-183の説明が続きます
「図5-183 予約済JCAヘッダー・プロパティjca.jndiの使用」の説明

動的パートナ・リンクを使用する場合は、次の点に注意する必要があります。

  • コネクション・ファクトリをSOAサーバー上に事前構成する必要があります。BPELの例では、シナリオのデプロイ前に、FtpAdapterのWebLogic Serverデプロイメント・ディスクリプタでeis/Ftp/FtpAdater1およびeis/Ftp/FtpAdater2の両方を構成する必要があります。

  • 動的パートナ・リンクはアウトバウンド起動にのみ適用可能です。

5.5.12.2 アウトバウンド書込み操作からのファイルの詳細の取得

ファイル・アダプタ構成ウィザードには「出力ヘッダーの追加」というオプションがあり、リクエスト/レスポンス操作で出力ヘッダーを取得できます。

5.5.13 ファイル/FTPアダプタの順序付け方法の変更

ファイル/FTPアダプタでは、順序番号を使用するようにアウトバウンド書込みを構成できます。たとえば、address-data_%SEQ%.txtをFileNamingConventionとして選択すると、すべてのファイルがaddress-data_1.txtaddress-data_2.txtなどとして生成されます。

図5-184を参照してください。

図5-184 アウトバウンド書込みの構成

図5-184の説明が続きます
「図5-184 アウトバウンド書込みの構成」の説明

順序番号は、特定のアダプタ・プロジェクト(またはシナリオ)のコントロール・ディレクトリに属しています。ファイルまたはFTPアダプタを使用するプロジェクトごとに、記帳を目的として一意のディレクトリが作成されます。このコントロール・ディレクトリは一意である必要があるため、アダプタにより、ダイジェストが使用されて同じコントロール・ディレクトリが2つ存在しないことが確認されます。

たとえば、例にあるFlatStructureサンプルの場合、マイ・プロジェクトのコントロール情報はFMW_HOME/user_projects/domains/soainfra/fileftp/controlFiles/[DIGEST]/outboundに配置されます(DIGESTの値はプロジェクトごとに異なります)。

このディレクトリ内にあるcontrol_ob.propertiesファイルに、順序番号が保持されます。順序番号はバイナリ形式で保持されるため、その内容を表示するには16進数エディタが必要です。もう1つ、SEQ_nnnという0バイトのファイルがあります。この追加のファイルはバックアップとして保持されます。

アダプタ・ランタイムにとって問題となることの1つは、コントロール・ファイルが2つのスレッドによって誤って同時に更新されないように、コントロール・ファイルに対するすべての書込みを保護する必要がある点です。この保護のためにmutexが利用されています。

mutexには異なるタイプのものがあります。

  • メモリー内

  • データベース・ベース

  • Coherenceベース

  • ユーザー定義

特にアダプタに対するトランザクションの負荷が大きい場合、mutexがボトルネックになることがあります。ただし、アダプタでは、データベース順序またはストアド・プロシージャからアダプタの順序値が導出されるように構成を変更できます。その場合、mutexがバイパスされてプロセスのスループットが向上します。

スループットを向上させる最も単純な方法は、eis/HAFileAdapterを使用するようにアウトバウンドJCAファイルのJNDIコネクション・ファクトリの位置を切り替える方法です。

図5-185 HAFileAdapterを使用するためのJNDIコネクション・ファクトリの切替え

図5-185の説明が続きます
「図5-185 HAFileAdapterを使用するためのJNDIコネクション・ファクトリの切替え」の説明

この変更の結果、アダプタ・ランタイムによってOracle Database上に順序が作成されるようになります。たとえば、SOAインフラ・スキーマ内でselect * from user_sequencesを実行すると、SEQ_<GUID>__という名前で新しい順序が作成されて表示されます(GUIDはプロジェクトごとに異なります)。

ただし、独自の順序を使用するには、SequenceNameというJCAファイルに新しいプロパティを追加する必要があります。この順序は、soainfraスキーマで前もって作成する必要があります。図5-186を参照してください。

図5-186 SequenceNameプロパティの追加

図5-186の説明が続きます
「図5-186 SequenceNameプロパティの追加」の説明

デハイドレーション・サポートとしてDB2またはMS SQL Serverを使用するシナリオは、若干異なります。DB2では順序がネイティブでサポートされていますが、MS SQL Serverではサポートされていません。

DB2の場合、アダプタ・ランタイムは固有に生成された順序を使用しますが、MSSQL Serverの場合、アダプタは製品に付属のストアド・プロシージャを利用します。

SOA Suiteでデハイドレーション・ストアとしてDB2を実行する場合と同じ結果を得るには、JCAファイル内のコネクション・ファクトリのJNDI名をeis/HAFileAdapterDB2に変更します。

デハイドレーション・ストアとしてMSSQLを実行する場合と同じ結果を得るには、eis/HAFileAdapterMSSQLを使用します。

図5-187に示すように、製品に付属しているストアド・プロシージャ以外のストアド・プロシージャを使用するには、バインディング・プロパティを使用してアダプタの動作をオーバーライドする必要があり、具体的にはストアド・プロシージャを使用するようにアダプタに指示する必要があります。

図5-187 ストアド・プロシージャを使用するようにアダプタに指示

図5-187の説明が続きます
「図5-187 ストアド・プロシージャを使用するようにアダプタに指示」の説明

ファイル/FTPアダプタを追加モードで使用する場合、アダプタ・ランタイムによってmutexの機能が下げられてペシミスティック・ロックが使用され、異なるノードのライターによって同じファイルに対して同時に追加が実行されないようになります。

5.5.14 ファイルの処理順序の制御

ファイル/FTPアダプタでは、ファイルを処理する順序を制御できます。たとえば、ファイルの変更時刻、ファイル・サイズまたは他の決定要素の順序で、ファイルを処理する必要がある場合があります。

ファイル/FTPアダプタでは、インバウンド・ファイル/FTPアダプタ・サービスのJCAファイルでFileSorter属性を定義することによって、ファイルを処理する順序を制御できます。図5-188を参照してください。

図5-188 ファイル・ソーターの指定

図5-188の説明が続きます
「図5-188 ファイル・ソーターの指定」の説明

ファイル/FTPアダプタには、最終変更時刻を使用する2つの事前定義済のソーターが備わっています。たとえば:

図5-189 事前定義済ソーターの使用

図5-189の説明が続きます
「図5-189 事前定義済ソーターの使用」の説明

ただし、ソート順序を自分で定義することが必要な場合もあります。このためには、Java Comparatorを実装し、それをファイル・アダプタに登録できます。これを行うには、次のステップを実行します。

  1. Comparatorを記述します。たとえば、FileSizeSorter Comparatorでは、ファイルがファイル・サイズの降順でソートされます。図5-190を参照してください。

    図5-190 FileSorterSize Comparator

    図5-190の説明が続きます
    「図5-190 FileSorterSize Comparator」の説明
  2. このクラスをコンパイルするには、fileAdapter.jarをクラスパスに配置する必要があります。[FMW_HOME]/AS11gR1SOA/soa/connectorsから、たとえばjar xvf FileAdapter.rarを実行してFileAdapter.rarを展開し、fileAdapter.jarを抽出します。FileSizeSorter.javaクラスをコンパイルするには、fileAdapter.jarをクラスパスに配置する必要があります。たとえば:
    setenv CLASSPATH fileAdapter.jar
    javac -d .FileSizeSorter.java

  3. コンパイルの後、クラスをその独自のjarファイルにバンドルします。たとえば、
    jar cvf fileadapter-sorter.jar file
    
  4. fileadapter-sorter.jar FileAdapter.rarにバンドルします。たとえば、
    jar uvf FileAdapter.rar fileadapter-sorter.jar
    

    このステップは、FileAdapter.rarをロードするClassLoaderからfileadapter-sorter.jarが見えるようにするために必要です。たとえば、fileadapter-sorter.jarおよびfileadapter.jar[DOMAIN_HOME]/libにコピーするなど、他の方法もありますが、前述の例が最も単純かつ簡単です。

  5. JCAファイルでSingleThreadModeltrueとして設定します(この項の最初の画像を参照してください)。
  6. BPELを使用している場合は、同期プロセスをモデル化していることを確認します。

5.5.15 FTPアダプタの拡張

現在のFTPアダプタは、標準のFTPコマンドおよび各コマンドの有効なリターン・コードが定義されたRFC 959に準拠しています。ただし、固有のコマンドを使用するFTPサーバーもあります。たとえば、メインフレームで実行される一部のFTPサーバーではQUOTE SITEコマンドを使用して、保存フォーマットを送信します。たとえば、QUOTE SITE BLKSIZE=30000 (相互作用のブロック・サイズを30000バイトに設定)とMFTではSITE FTPコマンドが使用されます。

また、一部のFTPサーバーでは、FTPアダプタで処理する必要のある標準のFTPコマンドに対しても標準でないFTPリターン・コードを返します。FTPアダプタには、FTPサーバーのこれらのわずかな機能の違いに対応するための接続性レイヤーが用意されています。要約すると、次の理由でFTPアダプタの内部を公開する必要性があります。

  • 一部のFTPサーバーは、異なる方法で標準のFTPコマンドに応答します。

  • 特定のFTPサーバーでは、固有のFTPコマンドを使用する必要があります。

  • 一部のFTPサーバーは、わずかに異なる形式でデータを返します。たとえば、一部のFTPサーバーではLISTコマンドによりタイムスタンプ情報がAug 29 2016として返され、他のFTPサーバーでは29AUG-2016として返されます。

FTPアダプタでは、一連のFTPコマンドおよびそのリターン・コードが使用されます。接続性をサポートするために、FTPアダプタによってこの機能が実装されます。

5.5.15.1ユースケース: FTPクライアント・ログインのFTPアダプタ拡張

FTPアダプタは、デフォルトのFTPClient実装のlogin()操作をオーバーライドするように拡張できます。

ユーザーがFTPサーバーへのログイン時にアカウント名を指定する必要がある場合に対応して、デフォルトの実装を拡張できます。一般的なFTPクライアントは通常、各FTP接続を開始するときに、認可プロセスの一部としてFTPサーバーに対してUSERコマンド、PASSコマンドの順に使用します。たとえば:

USER <SP><user-name><CRLF>
PASS <SP> <password><CRLF>

この中の<SP>は空白を示し、<CRLF>はキャリッジ・リターンと改行を示します。ただし、あるケースでは、PASSコマンドの後にアカウント名(ACCTコマンド)が渡されることをFTPサーバーが期待します。たとえば、

ACCT <SP><Account Name><CRLF>

Account Nameは、ユーザーが認可をリクエストするサーバー上のアカウント名を示します。

この拡張によって、FTPアダプタは、認可でPASSコマンドの送信直後にACCTコマンドを送信できるようになります。

この動作を実現するには、(FTPアダプタに付属の) FTPClient実装により公開されたlogin() メソッドをオーバーライドする必要があります。

FTPアダプタにおけるFTPプロトコルのクライアント側はインタフェースFTPClientを使用して公開され、デフォルトの実装はFTPClientによって提供されます。

FTPアダプタでは、デフォルトのFTPClient実装をオーバーライドし、login()メソッドにACCTのサポートを追加できます。

この方法でFTPClientを拡張した後は、FTPアダプタのコネクション・ファクトリ内にクラス名を構成する必要があります。

5.5.15.1.1 FTPClient実装の拡張によるlogin()のオーバーライド

次のステップを実行して、FTPクライアントを拡張します:

  1. 「Manifest.MFファイルを使用したコンパイル用のfileftp.jarの生成」の説明に従って、fileftp.jarを作成します。これは1回のアクティビティであり、コンパイルのみに必要です。
  2. fileftp.jarをクラスパスに追加します。たとえば:
    set CLASSPATH=$ORACLE_SOA_HOME/soa/modules/oracle.soa.adapter_11.1.1/fileftp.jar
    
  3. MyFtpClient.javaを作成します。ACCTコマンドのサポートを追加するためにlogin()メソッドをオーバーライドする方法については、「FTPClient実装のサンプル」を参照してください。
  4. MyFTPClient.javaをコンパイルします:
    javac -d . MyFTPClient.java

    コンパイル後、jarとしてパッケージ化します(たとえば、myftpclient.jar):

    jar cvf myftpclient.jar folder
    
  5. myftpclient.jar$FMW_HOME/soa/soa/modules/oracle.adapter.ext_12.1.2にコピーします:
    cp myftpclient.jar $FMW_HOME/soa/soa/modules/oracle.adapter.ext_12.1.2
    
  6. antを実行して、myftpclient.jarをアダプタ・クラスパスに追加します:
    cd $FMW_HOME/soa/soa/modules/oracle.adapter.ext_12.1.2 
    ant
    
  7. FTPアダプタのWebLogicデプロイメント・ディスクリプタ内にコネクション・ファクトリ・エントリFtpClientClass="com.acme.MyFTPClient"を設定します。

    これにより、FTPアダプタはデフォルトのFTPClientではなくMyFTPClientを使用できます。

  8. サーバーを再起動します。
5.5.15.2 ユースケース: MLSDコマンドからのレスポンスを処理するためのFTPアダプタの構成

FTPアダプタは、LISTコマンドを送信してサーバーからファイル・リストを返します。FTPアダプタは、LISTコマンドに対するレスポンスを使用して、処理が必要なファイルのリストを取得します。

ただし、LISTコマンドへのレスポンスは、FTPサーバーのタイプによって若干異なります(表5-22を参照)。

レスポンスの構造の違いに対応するために、FTPアダプタでは解析用にFtpListResponseParserおよびFtpTimestampParserインスタンスが採用されています。FTPアダプタには、各種FTPサーバー・タイプに対するFtpListResponseParserおよびFtpTimestampParserの実装が事前に作成されて付属しています。

FTPアダプタのWebLogicデプロイメント・ディスクリプタのコネクション・ファクトリ内にこれらの実装を構成するには、listParserKeytimeParserKeyに適切な値を設定します。

表5-22 様々なFTPサーバー・タイプからのLISTコマンドに対するレスポンス

FTPサーバー・タイプ LISTコマンドの結果

UNIX

-rwxr-xr-x 2 root root 1024 Apr 1 14:12 test.txt

Windows

09-13-16 12:10 23 test.txt

MVS

SAVE00 3390 2016/06/23 1 1 FB 128 6144 PS IN.TXT

5.5.15.2.1 MLSDの拡張

MLSDは、FTPサーバー・タイプに関係なく標準化されたディレクトリ・リスティングを提供する新しいFTPコマンドです。

MLSDコマンドをサポートするようにFTPアダプタを拡張できます。

MLSDレスポンスのフォーマットは次に示す例で定義されているため、MLSDコマンドに対するレスポンスは、LISTコマンドを使用する場合とは異なります。

type=file;modify=20110101010101;size=1024; address-csv.txt
type=dir;modify=20110101010101; my_files
type=file;size=1023;modify=20112011011001; index.htm

現在、MLSDは一部のFTPサーバーのみでサポートされています。

5.5.15.2.2 MLSDコマンドをサポートするためのプラグイン実装の構成

MLSDコマンドをサポートするために、FtpListResponseParserおよびFtpTimestampParserのプラグイン実装(「FtpTimestampParserインタフェース」を参照)を使用するには:

  1. 「Manifest.MFファイルを使用したコンパイル用のfileftp.jarの生成」の説明に従って、fileftp.jarを作成します。これは1回のアクティビティであり、コンパイルのみに必要です。
  2. fileftp.jarをクラスパスに追加します。たとえば:
    set CLASSPATH=$ORACLE_SOA_HOME/soa/modules/oracle.soa.adapter_11.1.1/fileftp.jar
    
  3. MLSDListResponseParserImpl.javaを作成します。MLSD FTPコマンドに対するレスポンスを解析するパーサーの実装の詳細は、「FtpListResponseParser」を参照してください。
  4. MLSDTimestampParserImpl.javaを作成します。MLSDのレスポンスに基づいて最終変更時刻を解析するパーサーの実装の詳細は、「FtpTimestampParserインタフェース」を参照してください。
  5. 2つのクラスをコンパイルし、jarとして(たとえば、my_ftpextension.jarとして)パッケージ化します。コンパイルが失敗した場合、fileftp.jarがクラスパスに存在していることを確認してください。
    javac -d . MLSDListResponseParserImpl.java
    javac -d . MLSDTimestampParserImpl.java
    jar cvf my_ftpextension.jar folder
  6. my_ftpextension.jar$FMW_HOME/soa/soa/modules/oracle.adapter.ext_12.1.2にコピーします。
    cp my_ftpextension.jar $FMW_HOME/soa/soa/modules/oracle.adapter.ext_12.1.2
    
  7. antを実行して、myftpclient.jarをアダプタ・クラスパスに追加します:
    cd $FMW_HOME/soa/soa/modules/oracle.adapter.ext_12.1.2 
    ant
  8. コネクション・ファクトリ・エントリlistParserKey ="com.acme.MLSDListResponseParserImp"をFTPアダプタのWebLogicデプロイメント・ディスクリプタに設定して、新しいパーサーをポイントします。
  9. コネクション・ファクトリ・エントリtimeParserKey="com.acme. MLSDTimestampParserImpl"を、FTPアダプタのWebLogicデプロイメント・ディスクリプタに追加します。
  10. サーバーを再起動します。

ほとんどのFTPサーバーでは、最近作成されたファイルの変更時刻の表示書式が古いファイルの表示書式と若干異なるため、FtpTimestampParserの実装では2種類の日付/時間書式(defaultDateFormatおよびrecentDateFormat)が公開されます。

たとえば、UNIXシステムでは、古いファイルはAug 29 2011と表示され、2014年3月12日に作成された新しいファイルはMar 12 10:00と表示されます。

MLSDを使用する場合、weblogic-ra.xml内のコネクション・ファクトリで、defaultDateFormatyyyyMMddhhmmssに、recentDateFormatyyyyMMddhhmmss.SSSに設定する必要があります。

5.5.15.3 ユースケース: LISTコマンドではなくMLSDコマンドを送信するためのリスティング操作の拡張

FTPアダプタは次の操作を公開し、それぞれが対応するFTPコマンドにマップされます:

表5-23 FTPアダプタとFTPコマンドのマッピング

FTPアダプタ操作 説明 FTP操作

リスティング

サーバーからファイルのリストを返します。

LIST/NLST/MLSD

格納

アウトバウンド操作としてサーバーに単一ファイルを格納します。

STOR

取得

サーバー上の単一ファイルを取得します。

RETR

削除

サーバー上の単一ファイルを削除します。

DELE

リスティング操作にLISTではなくMLSDを送信し、STORではなくSTOU (Store Uniqueに対応するFTPコマンド)を送信するようにFTPアダプタのシナリオを構成できるため、これらの操作を拡張できます。他のコマンドも同様に変更できます。この場合、リスティング操作を拡張して、すでにサポートされているLIST/NLSTコマンドに加えて、MLSDもサポートされるようにします。

先に、MLSDに対するレスポンスを解析するようにFTPアダプタを構成しました。この項では、FTPアダプタで、他の場合は送信されるLIST/NLSTコマンドではなくMLSDコマンドが送信されるようにする方法について説明します。MLSDコマンドを送信するには、ftpmapping.xsdに対応するマッピング・ファイル(たとえば、my_mapping.xml)を作成し(「ftpmappingスキーマ」を参照)、リスティング操作をオーバーライドします。たとえば:

<ftpmapping xmlns="http://schemas.oracle.com
         /ftpadapter/mapping">
    <listing command="MLSD" argument="${default}"
           success="$ftp.code=150 or $ftp.code=125
                 or $ftp.code=226">
    </listing>
</ftpmapping>

この例のリスティング操作では、FTPサーバーでリスティングがソートされるように、基本のLISTコマンドではなくMLSDコマンドが使用されています。

成功/エラーの条件を指定するには、success属性を使用できます。コントロール・チャネルが125150または226を返した場合、FTPアダプタはこれを成功とみなしますが、それ以外の場合はアダプタ例外が発生し、インバウンドまたはアウトバウンドのリスティング操作を構成しているバインディング・コンポーネント・パイプラインに伝播されます。

マッピング・ファイルのMLSD引数として使用できる値は次のとおりです:

  • ${default}は、リクエストの結果として送信される元のディレクトリ・パスに置き換えられます。したがって、アウトバウンドjca内にPhysicalDirectoryとして/home/foo1を指定してコンポジットを構成し、アウトバウンド・ヘッダーでjca.ftp.Directoryパラメータのヘッダー値として/home/foo2を使用した場合、このパラメータは/home/foo2に置き換えられます。

    ほとんどの場合、引数値を${default}から他の値に変更することはありません。

  • マッピング・ファイル内のハードコードされた値(たとえば、argument="/home/bar" )。これを使用すると、ハードコードされた値が使用されます。これは、コンポジット構成内に構成したJCAパラメータ/ヘッダーをオーバーライドします。

マッピング・ファイルを作成した後は、それをコンポジット・アプリケーションにコピーする必要があります。マッピング・ファイルをコンポジット・アプリケーションのJCAファイルと同じディレクトリに追加します。マッピング・ファイルはJCAアクティブ化または相互作用の一部として構成する必要があります。

例: JCAアクティブ化または相互作用の一部としてのマッピングの構成

<?xml version="1.0" encoding="UTF-8"?>
<adapter-config name="FTPIn" adapter="Ftp Adapter" …>
   <connection-factory location="eis/Ftp/FtpAdapter" …/>
   <endpoint-activation operation="Get">
     <activation-spec className="oracle.tip.adapter.ftp.inbound.
         FTPActivationSpec">
             <[..]>
             <property name="FtpMappingFile"
                     value="my_mapping.xml"/>
            <[..]>
     </activation-spec>
   </endpoint-activation>

リスティングおよび取得操作を拡張し、OPTS UTF8 ONコマンドを送信してUTF-8文字を含むファイル名にアクセスします。FTPサーバーでUTF-8文字のサポートが自動的に有効にならない場合は、OPTS UTF8 ONコマンドを送信する必要があります。

例: OPTS UTF8 ONコマンドの送信

<ftpmapping xmlns="http://schemas.oracle.com/ftpadapter/mapping"> 
    
  <listing command="LIST" argument="${default}" success="$ftp.code = 150 or $ftp.code=125"> 
    <executecommandsbefore> 
    <ftp-command command="OPTS UTF8 ON"  success="$ftp.code = 200"/> 
    </executecommandsbefore> 
  </listing> 

  <retrieve command="RETR" argument="${default}" success="$ftp.code = 150 or $ftp.code=226"> 
    <executecommandsbefore> 
        <ftp-command command="OPTS UTF8 ON" success="$ftp.code = 200"/> 
    </executecommandsbefore> 
  </retrieve> 
</ftpmapping> 
5.5.15.4 ユースケース: MVSプラットフォームで実行されているFTPサーバーに追加の固有FTPコマンドを送信するための格納操作の拡張

MVSシステム上のデータセットには、ディスク領域(PRIMARY/SECONDARY)、論理レコード長(LRECL)、ブロック・サイズ(BLKSIZE)という特性があります。MVSシステムで実行されているFTPサーバーは、これらの構成を認識しています。

これらの構成にはそれぞれデフォルト値がありますが、MVSシステムからダウンロード/アップロードするデータセットによっては、デフォルトをオーバーライドする必要がある場合もあります。

たとえば、大きなデータセットを50MBのFTPサーバーにアップロードするとします。この場合は、STOR操作の実行前に追加の領域を割り当てる必要があります。たとえば、BLKSIZEとして6192、LRECLとして86を構成する必要があります。これらのパラメータを設定しない場合、FTP転送(STOR操作)は失敗します。

FTPサーバーの場合、固有のコマンドを送信してから送信するコマンドを送信するには QUOTE SITEを使用し、MFTにはSITEを使用します。

QUOTE SITEからのリターン・コードは固有コマンドの種類によって異なることがあります。その場合、次のコマンドがSTORコマンドより前に送信されます。

QUOTE<SP>SITE<SP>BLKSIZE=6192<CRLF>
QUOTE<SP>SITE<SP>LRECL=86<CRLF>
STOR<SP>SM.KAR.SARL<CRLF>

この場合は、これらの追加のQUOTE SITEコマンドをFTPサーバーに送信するためにSTOR操作を拡張しました。

FTPサーバーに送信できるのは制御コマンドのみです。制御コマンドとは、クライアントがデータ・チャネルからデータを読み取る必要がないコマンドのことです。たとえば、CWDPWDMKDQUOTE SITEDELEなどのコマンドは制御コマンドです。

一方、RETRSTORSTOULISTNLST、MLSDなどのコマンドはデータ・コマンドです。

データ・コマンドが発行されると、クライアントはデータ・チャネルからレスポンスを読み取る必要があります。ただし、制御コマンドの場合は、レスポンスは制御チャネル自体で返信されます。STORなどの制御コマンドをFTPサーバーに送信するには、ftpmapping.xsdに対応するマッピング・ファイル(my_mapping.xmlなど)を書き込む必要があります(ftpmapping Schemaを参照)。次の例に示すように、これによりSTOR操作がオーバーライドされます:

<ftpmapping xmlns="http://schemas.oracle.com/ftpadapter/mapping"> 
   <store>
      <executecommandsbefore>
         <ftp-command command="QUOTE SITE" argument="BLKSIZE=6192"
          success="$ftp.code &gt;= 200 and $ftp.code &lt;= 300"/> 
         <ftp-command command="QUOTE SITE" argument="LRECL=86"
          success="$ftp.code &gt;= 200 and $ftp.code &lt;= 300"/>
      </executecommandsbefore>
   </store>
</ftpmapping>

この例では、追加でQUOTE SITEコマンドを送信するSTOR操作の前にexecutecommandsbefore文があります。

同じ構成を次の例のように表現することもできます。

例 - マッピング・ファイルの構成

<ftpmapping xmlns="http://schemas.oracle.com/ftpadapter/mapping">
   <globalcommandsconfiguration>
      <global-ftp-command id="BLKSIZE" command="QUOTE SIZE" argument="${jca.ftp.BlockSize}" 
         success="$ftp.code &gt;= 200 and $ftp.code &lt;= 300"/>
      <global-ftp-command id="LRECL" command ="QUOTE SIZE" argument="${jca.ftp.LogicalRecordSize}" 
         success="$ftp.code &gt;= 200 and $ftp.code &lt;= 300"/>		
   </globalcommandsconfiguration>
   <store>
      <executecommandsbefore>
         <ftp-command commandref="BLKSIZE"/>
         <ftp-command commandref="LRECL"/>
      </executecommandsbefore>	
   </store>
</ftpmapping>

この例では、コマンドをグローバルに構成し、commandref属性を使用してこれらを参照しています。どちらのマッピング・メタデータ表現方法も同じであるため、要件に応じていずれかを選択できます。

jca.ftp.BlockSizeおよびjca.ftp.RecordSizeは正規化されたメッセージ・プロパティ(たとえば、BPEL <invoke>アクティビティにおけるヘッダーなど)として渡すことができます。

例 - BlockSizeおよびRecordSizeを正規化されたメッセージ・プロパティとして渡す方法

<assign name="AssignFtpMetadata">
<copy>
   <from expression="'BLKSIZE=6192'"/> 
   <to variable="blockSize"/> 
</copy>    
<copy>
  <from expression="LRECL=86"/>
  <to variable="logicalRecordSize"/>
</copy>    
<invoke name="WriteWeatherData"
        bpelx:invokeAsDetail="no"
        inputVariable="WriteWeatherData_Put_InputVariable"
        partnerLink="XmlOut"
        portType="ns2:Put_ptt" operation="Put">
   <bpelx:inputProperty name="jca.ftp.BlockSize"    
      variable="blockSize"/>
   <bpelx:inputProperty name="jca.ftp.LogicalRecordSize"                
      variable="logicalRecordSize"/>
</invoke>

マッピング・ファイルは、相互指定用の.jcaファイルと同じディレクトリにコピーする必要があります。このマッピング・ファイルは、次の例に示すようにJCA相互指定の一部として構成する必要があります。

例 - JCA相互指定の一部としてのマッピング・ファイルの構成

<adapter-config name="FTPOut" adapter="Ftp Adapter" …>
   <connection-factory location="eis/Ftp/FtpAdapter" …/>
   <endpoint-interaction operation="Get">
      <interaction-spec
         className="oracle.tip.adapter.ftp.outbound.FTPInteractionSpec">
            <[..]>
             <property name="FtpMappingFile" value="my_mapping.xml"/>
            <[..]>
      </interaction-spec>
   </endpoint-interaction>
</adapter-config>
5.5.15.5 その他の構成パラメータ、実装、インタフェースおよびスキーマ

FTPアダプタを拡張する際には、次のその他の構成パラメータを使用できます:

  • FtpMappingFile

    これは、インバウンド相互作用とアウトバウンド相互作用のどちらのjcaファイル内にも指定できます。これにより、コンポジット・アプリケーションを基準にしたマッピング・ファイルの相対パスが格納されます。「ftpmappingスキーマ」に、ftpmappingスキーマの例を示します。

    インバウンド操作とアウトバウンド操作の両方で、同じマッピング・ファイルを使用してください。

    たとえば、<property name="FtpMappingFile" value="xsd/ftp_mapping.xml"/>は、マッピング・ファイルがコンポジット・アプリケーションのxsdフォルダに存在していることを意味します。

  • ftpClientClass

    これは、FTPアダプタのデプロイメント・ディスクリプタ内にコネクション・ファクトリ・パラメータとして指定できます。独自のFTPClient実装を指定する場合は、ここにその実装の完全修飾クラス名を挿入します。

  • listParserKey

    これは、FTPアダプタのデプロイメント・ディスクリプタ内にコネクション・ファクトリ・パラメータとして指定できます。独自のFtpListResponseParser実装を指定する場合は、ここにその実装の完全修飾クラス名を挿入します。

  • timeParserKey

    これは、FTPアダプタのデプロイメント・ディスクリプタ内にコネクション・ファクトリ・パラメータとして指定できます。

    独自のFtpTimestampParser実装を指定する場合は、ここにその実装の完全修飾クラス名を挿入します。

5.5.15.5.1 FTPClient実装のサンプル

FTPClient実装のサンプル・コードは次のとおりです:

import oracle.tip.adapter.file.FileResourceException; 
import oracle.tip.adapter.ftp.IFtpDescriptor; 
import oracle.tip.adapter.ftp.FTPReply; 
import oracle.tip.adapter.ftp.FTPClient; 
import oracle.tip.adapter.ftp.FTPCommand; 
import oracle.tip.adapter.ftp.IFTPClient; 
  
import javax.resource.ResourceException; 
import java.io.IOException; 
import oracle.tip.pc.infra.exception.PCExceptionIndex; 
import javax.resource.spi.security.PasswordCredential; 
import java.net.Socket; 
import java.util.logging.Logger; 
import java.util.logging.Level; 

  
public class TestFTPClient extends FTPClient 
    implements 
        IFTPClient { 
  
    private Logger _logger = Logger.getLogger 
        (TestFTPClient.class.getName()); 
    public TestFTPClient() { 
        super(); 
    } 
    public void initialize(IFtpDescriptor ftpDescriptor) { 
        super.initialize(ftpDescriptor); 
    } 
  
    public Logger getLogger() { 
        return _logger; 
    } 
  
    public boolean login(Socket controlSocket, 
                         PasswordCredential pc) 
        throws IOException, 
               ResourceException 
    { 
        int rc = 0; 
        String replyStr = null; 
        logDebug("TestFTPClient::login(...) invoked "); 
  
        replyStr = user(controlSocket, 
                        pc.getUserName()); 
        rc = getReplyCode(replyStr, 
                          m_ftpDesc.getHost()); 
  
        logDebug("TestFTPClient::command[USER] =>" + rc + "<="); 
  
        if(FTPReply.isPositiveCompletion(rc)) { 
            return true; 
        } 
        if(!FTPReply.isPositiveIntermediate(rc)) { 
            // USER failed 
            logError("Unable to login to server '" 
                     + m_ftpDesc.getHost() + "'; " + 
                     "FTP command USER returned unexpected reply code : " + rc); 
  
            FileResourceException frex = new 
FileResourceException(PCExceptionIndex.ERROR_LOGIN); 
            frex.setEISErrorCode(String.valueOf(rc)); 
            frex.setEISErrorMessage(replyStr); 
            throw frex; 
        } 
        replyStr = pass(controlSocket, 
                        new String(pc.getPassword())); 
        rc = getReplyCode(replyStr, m_ftpDesc.getHost()); 
        logDebug("TestFTPClient::command[PASS] =>" + rc + "<="); 
        if ( FTPReply.isPositiveCompletion(rc)) { 
            return true; 
        } 
        if ( !FTPReply.isPositiveIntermediate(rc)) { 
            // PASS failed 
            logError("Unable to login to server '" + 
                     m_ftpDesc.getHost() + "'; " + 
                     "FTP command PASS returned unexpected reply code : " + rc ); 
  
            FileResourceException frex = new 
FileResourceException(PCExceptionIndex.ERROR_LOGIN); 
            frex.setEISErrorCode(String.valueOf(rc)); 
            frex.setEISErrorMessage(replyStr); 
            throw frex; 
        } 
        //Check ACCT account 
        String accountName = "hard-coded"; 
        replyStr = sendCommand(controlSocket, 
                               FTPCommand.ACCT, 
                               accountName); 
        rc = getReplyCode(replyStr, 
                          m_ftpDesc.getHost()); 
        logDebug("TestFTPClient::command[ACCT] =>" + rc + "<="); 
        if ( !FTPReply.isPositiveCompletion(rc)) { 
            // ACCT failed 
            logError("Unable to login to server '" + m_ftpDesc.getHost() + "'; " + 
                     "FTP command ACCT returned unexpected reply code : " + rc ); 
  
            FileResourceException frex = new 
FileResourceException(PCExceptionIndex.ERROR_LOGIN); 
            frex.setEISErrorCode(String.valueOf(rc)); 
            frex.setEISErrorMessage(replyStr); 
            throw frex; 
        } 
        return true; 
  
    } 
  
    private void logDebug(String logData){ 
        _logger.log(Level.FINE, logData); 
    } 
  
    private void logError(String logData){ 
        _logger.log(Level.SEVERE, logData); 
    } 
}
 

例: ログイン成功後の追加コマンド(この例ではOPTS UTF8 ON)の送信

import oracle.tip.adapter.file.FileResourceException; 
import oracle.tip.adapter.ftp.IFtpDescriptor; 
import oracle.tip.adapter.ftp.FTPReply; 
import oracle.tip.adapter.ftp.FTPClient; 
import oracle.tip.adapter.ftp.FTPCommand; 
import oracle.tip.adapter.ftp.IFTPClient; 

import javax.resource.ResourceException; 
import java.io.IOException; 
import oracle.tip.pc.infra.exception.PCExceptionIndex; 
import javax.resource.spi.security.PasswordCredential; 
import java.net.Socket; 
import java.util.logging.Logger; 
import java.util.logging.Level; 


public class TestFTPClient extends FTPClient 
    implements 
        IFTPClient { 
  
    private Logger _logger = Logger.getLogger 
        (TestFTPClient.class.getName()); 
    public TestFTPClient() { 
        super(); 
    } 
    public void initialize(IFtpDescriptor ftpDescriptor) { 
        super.initialize(ftpDescriptor); 
    } 
  
    public Logger getLogger() { 
        return _logger; 
    } 
  
    public boolean login(Socket controlSocket, 
                         PasswordCredential pc) 
        throws IOException, 
               ResourceException 
    { 
        int rc = 0; 
        String replyStr = null; 
         
        logDebug("TestFTPClient::login(...) invoked "); 
  
        replyStr = user(controlSocket, 
                        pc.getUserName()); 
        rc = getReplyCode(replyStr, 
                          m_ftpDesc.getHost()); 
  
        logDebug("TestFTPClient::command[USER] =>" + rc + "<="); 
  
        if(FTPReply.isPositiveCompletion(rc)) { 
            return true; 
        } 
        if(!FTPReply.isPositiveIntermediate(rc)) { 
            // USER failed 
            logError("Unable to login to server '" 
                     + m_ftpDesc.getHost() + "'; " + 
                     "FTP command USER returned unexpected reply code : " + rc); 
  
            FileResourceException frex = new 
FileResourceException(PCExceptionIndex.ERROR_LOGIN); 
            frex.setEISErrorCode(String.valueOf(rc)); 
            frex.setEISErrorMessage(replyStr); 
            throw frex; 
        } 

        replyStr = pass(controlSocket, 
                        new String(pc.getPassword())); 
        rc = getReplyCode(replyStr, m_ftpDesc.getHost()); 
        logDebug("TestFTPClient::command[PASS] =>" + rc + "<="); 
        if ( FTPReply.isPositiveCompletion(rc)) { 

            // Send OPTS UTF8 ON 
            replyStr = sendCommand(controlSocket, 
                                   "OPTS UTF8 ON", null, true); 
            rc = getReplyCode(replyStr, 
                              m_ftpDesc.getHost()); 
            logDebug("TestFTPClient::command[OPTS UTF8 ON] =>" + rc + "<="); 
            if ( !FTPReply.isPositiveCompletion(rc)) { 
                // OPTS failed 
                logError("OPTS UTF8 ON command failed" + m_ftpDesc.getHost() + "'; " + 
                         "FTP command OPTS UTF8 ON returned unexpected reply code : " + rc ); 
            } 
            return true; 
        } 
        if ( !FTPReply.isPositiveIntermediate(rc)) { 
            // PASS failed 
            logError("Unable to login to server '" + 
                     m_ftpDesc.getHost() + "'; " + 
                     "FTP command PASS returned unexpected reply code : " + rc ); 
  
            FileResourceException frex = new 
FileResourceException(PCExceptionIndex.ERROR_LOGIN); 
            frex.setEISErrorCode(String.valueOf(rc)); 
            frex.setEISErrorMessage(replyStr); 
            throw frex; 
        } 

        return true; 
  
  
    } 
  
    private void logDebug(String logData){ 
        _logger.log(Level.FINE, logData); 
    } 
  
    private void logError(String logData){ 
        _logger.log(Level.SEVERE, logData); 
    } 
}
5.5.15.6 FtpListResponseParserインタフェース

次のFTPListResponseParserインタフェースは、FTPファイル・リスティングを解析してその情報をFileInfoインスタンスに変換するためのインタフェースを定義しています。

例 - FTPListResponseParserのサンプル

package oracle.tip.adapter.ftp.parsers;
import …
 
/**
 * FtpListResponseParser defines the interface for
 * parsing FTP file listings
 * and converting that information into FileInfo instances. 
 * It also uses a default
 * or a user supplied Timestamp parser instance to parse the 
 * file modified time 
 */
public interface FtpListResponseParser
{
 
 
  /**
   * This parameter can be used 
   * to throttle the Ftp Adapter to 
   * return the required 
   * number of files from the call based on heuristics 
   * such as memory available
   * @param pageSize The number of FileInfo 
   * instances to be returned
   */
  public void setPageSize(int pageSize);
 
  /**
   * @return Returns the page size
   */
  public int getPageSize();
 
  /**
   * This method is used to configure
   * the parser instance 
   * being returned. 
   * @param ftpDescriptor
   */
  public void configure(IFtpDescriptor ftpDescriptor);
  
  /**
   * Parses an Ftp listing and returns an array 
   * of FileInfo
   * @param directory The Ftp directory being listed
   * @param stream The data socket stream to read from
   * @param encoding Server encoding
   * @return The list of FileInfo instances
   * @exception Exception  Any exception in reading
   * the data socket stream.
   */
  
  public FileInfo[] parseListResponse(String directory, 
           InputStream stream, String encoding)
                   throws IOException;
 
  /**
   * Parses an Ftp listing and returns an
   * array of FileInfo 
   * using the default encoding
   * @param directory The Ftp directory being listed
   * @param stream The data socket stream to read from
   * @return The list of FileInfo instances
   * @exception Exception  Any exception in reading 
   * the data socket stream.
   */  
  public FileInfo[] parseListResponse(String directory, 
            InputStream stream) throws IOException;
  
  /**
   * Returns a single FileInfo instance from a single line
   * @param line The line read from the data socket
   */  
  public FileInfo parseLine(String line);
  
  /**
   * Reads and returns a single line from
   *  the data socket
   * @param reader The reader constructed 
   * from the data socket stream
   * @return The line read from the socket stream
   * @exception Exception  Any exception in 
   * reading the data socket stream.
   */  
  public String nextLine(BufferedReader reader)
            throws IOException;
  
  /**
   * Preprocessing hook before the list
   * is returned to the client
   * @param originalList List of lines read
   */  
  public List preProcess(List originalList);
  
  /**
   * Set the parser for parsing the File timestamps
   * returned from the call to listing
   * @param ftpTimestampParser The Timestamp
   * parser interface
   */  
  public void setTimestampParser(FtpTimestampParser
                   ftpTimestampParser);
  
  /**
   * Parses the timestamp from listing
   * @exception Exception  Any exception 
   * in parsing the time
   */    
  public long parseTimestamp(String timestamp)
      throws Exception;
}
5.5.15.7 FtpTimestampParserインタフェース

FTPTimestampParserは、FTPサーバー上のファイルのタイムスタンプを解析するためのインタフェースを定義します。次の例を参照してください。

例 - FtpTimestampParserインタフェースのサンプル

package oracle.tip.adapter.ftp.parsers;
 
import …;
/**
 * FtpTimestampParser defines
 * the interface for parsing timestamps from 
 * files on Ftp Server.
 * 
 */
 
public interface FtpTimestampParser
{
  /**
   * This parameter can be used to configure 
   * the timestamp parser implementation
   * @param ftpDescriptor The IFtpDescriptor 
   * instance used 
   *to configure the timestamp parser
   */
    public void setFtpDescriptor(
                  IFtpDescriptor ftpDescriptor);
  /**
   * Returns the timestamp from the file 
   * time in listing format
   * @param timestamp File time from the File listing
   * @return timestamp in long
   * @throws Exception
   */
    public long parseTimestamp(String timestamp)
                 throws Exception;
}
}
5.5.15.8 ftpmappingスキーマ

次の例に、FTPマッピング・スキーマのftpmappingを示します。

例 - FTPMappingスキーマ

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns="http://schemas.oracle.
                         com/ftpadapter/mapping"
            xmlns:tns="http://schemas.oracle.com
                         /ftpadapter/mapping"
            targetNamespace="http://schemas.oracle.com/
                         ftpadapter/mapping"
            elementFormDefault="qualified" 
                    attributeFormDefault=
                            "unqualified">
 
  <xsd:element name="ftpmapping">
    <xsd:complexType>
      <xsd:sequence>
       <xsd:element ref="globalcommandsconfiguration" 
                       minOccurs="0" />
        <xsd:element name="listing" type="tns:ftp-operation-type"
                       minOccurs="0" />
        <xsd:element name="retrieve" type="tns:ftp-operation-type" 
                       minOccurs="0"/>
        <xsd:element name="store" type="tns:ftp-operation-type"
                      minOccurs="0"/>
        <xsd:element name="delete" 
                    type="tns:ftp-operation-type"
                      minOccurs="0"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
       </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
 
</xsd:schema>
 
  <xsd:complexType name="ftp-operation-type">
    <xsd:sequence>
      <xsd:element ref="executecommandsbefore"
                   minOccurs="0"/>
      <xsd:element ref="executecommandsafter"
                    minOccurs="0"/>
    </xsd:sequence>
    <xsd:attribute name="command" type="xsd:string"
             use="optional" />
    <xsd:attribute name="argument" 
                              type="xsd:string"
             use="optional" />
    <xsd:attribute name="success" type="xsd:string"
             use="optional" />
    <xsd:attribute name="desc" type="xsd:string" 
             use="optional" />
    <xsd:attribute name="commandref" 
                   type="xsd:string" 
             use="optional" />
  </xsd:complexType>
 
  <xsd:element name="executecommandsafter">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="ftp-command" 
               minOccurs="0" maxOccurs="unbounded"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
 <xsd:element name="executecommandsbefore">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="ftp-command" 
                minOccurs="0" maxOccurs="unbounded"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
 
 <xsd:element name="ftp-command">
    <xsd:complexType>
      <xsd:attribute name="argument" 
                       type="xsd:string" 
                    use="optional" />
      <xsd:attribute name="success" 
                     type="xsd:string" 
                    use="optional" />
      <xsd:attribute name="desc"
                     type="xsd:string" 
                    use="optional" />
      <xsd:attribute name="command" 
                         type="xsd:string"
                    use="optional" />
      <xsd:attribute name="commandref" 
                           type="xsd:string" 
                    use="optional" />  
    </xsd:complexType>
  </xsd:element>
 
  <xsd:element name="global-ftp-command">
    <xsd:complexType>
      <xsd:attribute name="argument"
           type="xsd:string" 
                    use="optional" />  
      <xsd:attribute name="success" type="xsd:string" 
                    use="required" />
      <xsd:attribute name="desc" type="xsd:string"
                    use="optional" />
      <xsd:attribute name="id" type="xsd:string"
                    use="required" />
      <xsd:attribute name="command" type="xsd:string"
                    use="required" />
    </xsd:complexType>
  </xsd:element>
 
  <xsd:element name="globalcommandsconfiguration">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="global-ftp-command" 
                        minOccurs="0" 
                           maxOccurs="unbounded" />
5.5.15.8.1 Manifest.MFファイルを使用したコンパイル用のfileftp.jarの生成

次に示すように、内容を指定してManifest.MFファイルを作成します。必ず、各エントリが空白で区切られたClass-Pathディレクティブを含めてください。

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.1
Created-By: 20.4-b02 (Sun Microsystems Inc.)
Implementation-Vendor: Oracle
Implementation-Title: Ftp Adapter Extensibility
Implementation-Version: 11.1.1
Product-Name: Ftp Adapter Extensibility Manifest
Product-Version: 12.1.2.0.0
Specification-Version: 11.1.1
Class-Path: jca-binding-api.jar fileAdapter.jar ftpAdapter.jar 
../../../../wlserver/modules/javax.resource.javax.resource-api.jar 
../oracle.soa.fabric_11.1.1/bpm-infra.jar

このManifest.MFを含めるには、次の手順を実行します:

  1. fileAdapter.jarおよびftpAdapter.jarを、それぞれ次の場所から抽出します

    $fmwhome/soa/soa/connectors/FileAdapter.rarおよび$fmwhome/soa/soa/connectors/FTPAdapter.rar

  2. これらのファイルを$fmwhome/soa/soa/modules/oracle.soa.adapter_11.1.1にコピーします。
  3. 作成したManifest.MFを同じフォルダにコピーします:
    jar cmf fileftp.jar Manifest.MF
    
  4. 生成されたfileftp.jarをコンパイルに使用します。
5.5.15.8.2 ListParserおよびTimeParserのサンプル

次の例に、ListParserおよびTimeParserのサンプルを示します。

例 - ListParserおよびTimeParserのサンプル

package oracle.tip.adapter.ftp.test;
 
import java.util.regex.Pattern;
import java.util.Map;
import java.util.HashMap;
import java.util.StringTokenizer;
 
import oracle.tip.adapter.file.FileInfo;
import oracle.tip.adapter.file.FileLogger;
import oracle.tip.adapter.file.LoggerUtil;
import oracle.tip.adapter.ftp.IFtpDescriptor;
import oracle.tip.adapter.ftp.parsers.
                      FtpTimestampParser;
import oracle.tip.adapter.ftp.parsers.
                      FtpListResponseParserImpl;
/**
 * Implementation of FtpListResponseParser 
                       for MLSD responses
 * Responses are return as 
          - type=file;modify=20110101010101;size=1024; 
                                 filename
 */
 
public class MLSDListResponseParserImpl
  extends FtpListResponseParserImpl
{
  private static final String TYPE = "type";
  private static final String SIZE = "size";
  private static final String MODIFY = "modify";
 
  public MLSDListResponseParserImpl()
  {
  }
/**
   * Returns a FileInfo instance 
   * for a single line.
   * @param line Line from list response
   * @return FileInfo instance
   */
  public FileInfo parseLine(String line) 
       throws Exception
  {
 
    System.out.println
               ("MLSDListResponseParseImpl::parseLine
                called [" + line + "]");
    FileInfo fileInfo = new FileInfo();
    fileInfo.setRaw(line);
 
    //extract the file name
 
    String response[] = line.split(" ");
    if(response == null || response.length != 2){
       throw new Exception("Invalid response
                   from ftp server [" + line + "]");
    }
 
    fileInfo.setFileName(response[1]);
    StringTokenizer st = new 
                  StringTokenizer(response[0], ";");
    Map<String, String> properties = 
                  new HashMap<String, String>();
    String token = null;
    while(st.hasMoreElements()){
       token = st.nextToken().trim();
       int index = token.indexOf('=');
       if(index == -1){
           throw new Exception
          ("Invalid ftp line since token
                            [" + token + "] 
                 does not contain '='");
       }
       String key = token.substring(0, index).trim();
       String value = token.substring(index+ 1,
                  token.length()).trim();
       if(key.length() ==0 || value.length() ==0){
           throw new Exception("Invalid ftp line since 
             either key[" + key + "] or value [" + value + "]
                 is invalid");
       }
       properties.put(key, value);
    }
    String type = properties.get(TYPE);
    String modify = properties.get(MODIFY);
    String size = properties.get(SIZE);
    if("file".equals(type)){
        fileInfo.setFileType(FileInfo.IS_FILE);
    }
    else if("dir".equals(type)){
        fileInfo.setFileType(FileInfo.IS_DIR);
    }
    else {
        fileInfo.setFileType(FileInfo.IS_UNKNOWN);
    }
    try{
        fileInfo.setSize(Long.parseLong(size));
    }
    catch(NumberFormatException e){
    }
 
    long modifiedTime = 0;
    try{
        modifiedTime = parseTimestamp(modify);
        fileInfo.setTimestamp(modifiedTime);
    }
    catch(Exception e){
        FileLogger.logWarning
            ("Unable to parse timestamp[" + modify + "]",e);
    }
    System.out.println("FileInfo returned
                  [" + fileInfo + "]");
    return fileInfo;
  }