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

前
 
次
 

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

この章では、プロキシ・サービス内からカスタムJavaコードを呼び出すことによってOracle Service Busの機能を拡張する方法について説明します。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コールアウトの構成については、21.20項「Javaコールアウト・アクションの追加」を参照してください。

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

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

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

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

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

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

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

42.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[]配列に変換します。

42.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()メソッドは、トランスポート・レイヤーでのアウトバウンド・メッセージの再試行に応じるなどのために、メッセージ処理時に何度も呼び出されることがあります。

42.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の場合、スレッドの作成は推奨されません。