ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Service Bus管理者ガイド
11g リリース1(11.1.1.4.0)
B61436-02
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

41 JavaコールアウトおよびPOJOを使用した拡張性

Oracle Service Busの機能を拡張できるようにするために、プロキシ・サービス内からカスタムJavaコードを呼び出すことができます。Oracle Service Busでは、POJO (Plain Old Java Object)へのコールアウトを可能にする「Javaコールアウト」アクションを使用したJava終了メカニズムをサポートしています。

POJOからは静的メソッドにアクセスすることが可能です。POJOとそのパラメータは、設計時にOracle Service BusコンソールまたはEclipse用Oracle Service Busプラグインに表示されます。パラメータは、メッセージ・コンテキスト変数にマップできます。

また、 Javaコールアウトを使用してJavaオブジェクトを作成し、パイプラインに格納したり、Javaオブジェクトをパラメータとして他のJavaコールアウトに渡したりすることもできます。

POJOへのJavaコールアウトの構成については、22.20項「Javaコールアウト・アクションの追加」を参照してください。

41.1 使用方法のガイドライン

Oracle Service BusでJavaコールアウトを使用できるシナリオは以下のとおりです。

Javaコールアウトの入力と戻りの型は制限されていません。Javaオブジェクトのパイプラインでの格納と受渡しの詳細は、38.3.5項「body変数内のJavaコンテンツ」を参照してください。

Enterprise JavaBeans (EJB)もJava終了メカニズムを提供します。次の場合は、Javaコールアウトではなく、EJBを使用することをお薦めします。

アウトバウンド・メッセージには、POJOまたはEJBを使用するかわりにカスタム・トランスポートを記述することをお薦めします。

41.2 ストリーミング・コンテンツの操作

バイナリ・コンテンツを入力引数としてコールアウト・メソッドに渡すため、およびJavaコールアウト・メソッドからストリーミング・コンテンツの結果を受け入れるために、Javaコールアウトを使用してストリーミング・コンテンツを操作できます。

41.2.1 ストリーミング・コンテンツをJavaコールアウトに渡す方法

Javaコールアウト・メソッドに、バイナリ・コンテンツを入力引数としてストリーミング形式で渡すことができます。Oracle Service Busは入力引数のJavaタイプを確認して処理します。引数のタイプがjavax.activation.DataSourceの場合、システムはラッパーDataSourceオブジェクトを作成し、Source.getInputStream()メソッドを呼び出して、対応するソースからInputStreamを取得します。このメソッドは、Javaコールアウト・コードから必要なだけ何回でも呼び出すことができます。

また、getContentType()メソッドは、バイナリ・コンテンツがページングされたMIME添付ファイルでないかぎり、application/octet-streamを返します。バイナリ・コンテンツがページングされたMIME添付ファイルである場合は、対応するMIME部分のContent-Typeヘッダー(存在する場合)が使用されます。

同様に、getName()メソッドは、バイナリ・コンテンツがページングされたMIME添付ファイルでないかぎり、バイナリ・コンテンツの参照属性の文字列値を返します。バイナリ・コンテンツがページングされたMIME添付ファイルである場合は、対応するMIME部分のContent-IDヘッダー(存在する場合)が使用されます。getOutputStream()メソッドは必要に応じてUnsupportedOperationExceptionをスローします。

完了後、結果はJavaコールアウト・メソッド引数に渡されます。入力ストリームのバイナリ・オクテットを正しく解釈するために、Javaコールアウト・メソッドでContent-Transfer-Encodingヘッダーの値が必要な場合もあります(たとえば、エンコーディングがバイナリ、7ビット、8ビットのいずれであるかを判別する場合ど)。次に示すように、このパラメータを別個の引数として渡すことができます。

$attachments/*:attachment[1]/*:Content-Transfer-Encoding/text()

入力引数がDataSourceでない場合、Oracle Service Busは引数をbyte[]配列に変換します。

41.2.2 Javaコールアウトからコンテンツ結果をストリーミングする方法

Javaコールアウト・メソッドからストリーミング・コンテンツ結果を取得できます。この処理のために、Oracle Service Busは結果のJavaタイプを確認し、適切なコンテキスト変数の値を対応するctx:binary-content XML要素に設定して、新しいソースをソース・リポジトリに追加します。


注意:

Javaコールアウト・メソッドからファイルのコンテンツを返す場合、javax.activation.FileDataSourceのインスタンスを使用することができます。

Oracle Service Busパイプラインがソースのバイナリ・コンテンツを必要とする場合、ctx:binary-content要素に対応するDataSourceオブジェクトをリポジトリから検索して、バイナリ・オクテットを取得するためにDataSource.getInputStream()メソッドを呼び出します。

getInputStream()メソッドは、トランスポート・レイヤーでのアウトバウンド・メッセージの再試行に応じるなどのために、メッセージ処理時に何度も呼び出されることがあることに注意してください。

41.3 ベスト・プラクティス

POJOは、Oracle Service BusでJARリソースとして登録されます。JARリソースの詳細は、第8章「JAR」を参照してください。

通常、JARはサイズを小さくし、簡単なものにすることをお薦めします。JARが呼び出すサイズの大きいコードまたは使用される大きなフレームワークは、システム・クラス・パスに含めることをお薦めします。システム・クラス・パスを変更する場合は、サーバーを再起動する必要があります。

独立したクラスおよび重複するクラスは、同じJARリソースに含め、性質上区別されるクラスは異なるJARに含めることをお薦めします。JARを変更すると、そのJARを参照するすべてのサービスが再デプロイされます。これはOracle Service Busにとって多大な時間を必要とする場合があります。同じクラスを、競合させずに複数のJARリソースに配置できます。JARは、最初に参照されたときに、動的にクラス・ロードされます。

1つまたは複数のプロキシ・サービスで、単一のPOJOを呼び出せます。プロキシ・サービスのすべてのスレッドが同じPOJOを呼び出します。そのため、POJOはスレッド・セーフであることが必要です。POJOのクラスまたはメソッドは同期できます。この場合、呼出しを行うすべてのプロキシ・サービスのすべてのスレッドによるアクセスを順序付けします。POJOコードによって、任意のより詳細な並行処理(たとえば、データベース読込みの結果キャッシュへのアクセスの制御や、古いキャッシュ・エントリ処理の実装)を実装する必要があります。

通常、POJOの場合、スレッドの作成は推奨されません。