ユーザーズ ガイド

     前  次    目次     
ここから内容

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

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

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

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

POJO への Java コールアウトのコンフィグレーションについては、以下を参照してください。

 


使用方法のガイドライン

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

Java コールアウトの入力型と戻り値の型には制限はありません。ただし、プリミティブ、String、または XmlObject 以外の戻り値の型を (変更せずに) 渡すことができるのは、他の Java コールアウトに対してのみです。パイプラインにおける Java オブジェクトの格納と受け渡しの詳細については、「body 変数内の Java コンテンツ」を参照してください。

エンタープライズ JavaBean (EJB) も Java 終了メカニズムを提供します。以下の場合は、POJO ではなく、EJB を使用することをお勧めします。

発信メッセージには、POJO または EJB を使用する代わりにカスタム転送を記述することをお勧めします。

 


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

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

ストリーミング コンテンツを 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[] 配列に変換します。

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

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

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

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

getInputStream() メソッドは、たとえば転送レイヤでの発信メッセージの再試行に応じて、メッセージ処理時に何度も呼び出されることがあるので注意してください。

 


ベスト プラクティス

POJO は JAR リソースとして Oracle Service Bus に登録されています。JAR リソースの詳細については、『Oracle Service Bus Console の使い方』の「JAR」を参照してください。

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

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

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

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


  ページの先頭       前  次