例をもとにISI呼び出しをするカスタムアダプタのアプリケーションの作成方法を説明します。
アプリケーションの例
import javax.resource.ResourceException;
import javax.resource.cci.Connection;
import javax.resource.cci.ConnectionFactory;
import javax.resource.cci.IndexedRecord;
import javax.resource.cci.Interaction;
import javax.resource.cci.InteractionSpec;
import javax.resource.cci.MappedRecord;
import javax.resource.cci.RecordFactory;
import com.fujitsu.esi.jca.inbound.ESIInteractionSpec;
import com.fujitsu.esi.jca.inbound.ESIManagedConnectionFactory;
import com.fujitsu.esi.message.ESIHeaderConstants;
public class ISICall {
public byte[] call(String serviceEndpointName, byte[] payload) {
byte[] returnPayload = null;
Connection connection = null;
Interaction interaction = null;
try {
// (1)ConnectionFactoryの生成
ESIManagedConnectionFactory managedConnectionFactory = new ESIManagedConnectionFactory();
ConnectionFactory connectionFactory =
(ConnectionFactory) managedConnectionFactory.createConnectionFactory();
// (2)Connectionの取得
connection = connectionFactory.getConnection();
// (3)InteractonSpecの作成
ESIInteractionSpec interactionSpec = new ESIInteractionSpec();
interactionSpec.setInteractionVerb(InteractionSpec.SYNC_SEND_RECEIVE);
interactionSpec.setServiceName(serviceEndpointName);
// (4)入出力Recordの作成
RecordFactory recordFactory = connectionFactory.getRecordFactory();
// 入力Recordの作成
IndexedRecord input = recordFactory.createIndexedRecord(null);
// ペイロードの設定
input.add(payload);
// ヘッダの設定
MappedRecord headerMap = recordFactory.createMappedRecord(null);
headerMap.put("header1", "value1");
input.add(headerMap);
// 出力Recordの作成
IndexedRecord output = recordFactory.createIndexedRecord(null);
// (5)シーケンス処理の呼び出し
interaction = connection.createInteraction();
interaction.execute(interactionSpec, input, output);
// (6)処理結果の取得
returnPayload = (byte[]) output.get(0);
MappedRecord returnHeader = (MappedRecord) output.get(1);
} catch (ResourceException ex) {
ex.printStackTrace();
} finally {
// (7)クローズ処理
// Interactionのクローズ
if (interaction != null) {
try {
interaction.close();
} catch (ResourceException ex) {
ex.printStackTrace();
}
}
// Connectionのクローズ
if (connection != null) {
try {
connection.close();
} catch (ResourceException ex) {
ex.printStackTrace();
}
}
}
return returnPayload;
}
}ConnectionFactoryの生成
J2EE Connection Architectureの記述形式でConnectionFactoryを生成します。
Connectionの取得
J2EE Connection Architectureの記述形式でConnectionを生成します。
InteractonSpecの作成
ISI呼び出しの情報を設定するInteractionSpec(ESIInteractionSpec)を生成します。以下の情報を設定します。
InteractionVerb
ISIを同期で呼び出すか、非同期で呼び出すかを指定します。
同期呼び出しの場合
InteractionSpec.SYNC_SEND_RECEIVE
非同期呼び出しの場合
InteractionSpec.SYNC_SEND
ServiceName
インバウンドのサービスエンドポイント名を指定します。
指定するサービスエンドポイントのメッセージング(同期/非同期)はInteractionVerbプロパティで指定した同期/非同期と必ず一致させてください。一致していない場合、実行エラーになります。
インバウンドルーティングを行う場合は、このプロパティは設定不要です。
このプロパティが設定されている場合、RoutingNameプロパティの設定は無視されます。
RoutingName
インバウンドルーティングを行う場合に、ルーティング定義名を指定します。
インバウンドルーティングを行わない場合、このプロパティは設定不要です。
入出力Record の作成
J2EE Connection Architectureの記述形式でRecordを生成します。入出力Recordには以下の型を使用できます。
IndexedRecord
MappedRecord
また、入力Recordにリクエスト情報を設定します。入力Recordに設定するリクエスト情報は以下のとおりです
ペイロード
メッセージの本文を表します。ペイロードは必須です。byte[]型で入力Recordに設定します。
ヘッダパラメタ
メッセージのヘッダ情報を表します。ヘッダパラメタは省略できます。MappedRecord型で入力Recordに設定します。
入力Recordにリクエスト情報を設定する方法は、入力Recordに使用するRecordの型によって異なります。
IndexedRecordを使用する場合
ペイロード
インデックス0番目に設定します。
ヘッダパラメタ
メッセージのヘッダを設定します。
インデックス2番目以降に設定した情報は無視されます。
MappedRecordを使用する場合
ペイロード
キー名「com.fujitsu.esi.jca.payload」に設定します。
ヘッダパラメタ
キー名「com.fujitsu.esi.jca.header」に指定します。
上記以外のキー名で設定した情報は無視されます。
シーケンス処理の呼び出し
J2EE Connection Architectureの記述形式でInteractionを生成し、executeメソッドを呼び出します。
処理結果の取得
出力Recordから結果を取り出します。
クローズ処理
InteractionとConnectionのクローズを行います。
コンパイルに必要なクラスパス
インバウンドのカスタムアダプタのコンパイル時には、以下のクラスパスを設定してください。
<INSDIR>\lib\esicore.jar
<Interstageインストールディレクトリ>\J2EE\lib\isj2ee.jar