ページの先頭行へ戻る
Interstage Business Application Server アプリケーション開発ガイド
FUJITSU Software

9.2.5 クライアントアプリケーションの処理の作成

同期アプリケーション連携実行基盤に配備された業務アプリケーションを呼び出すためのクライアントアプリケーションを作成します。
クライアントアプリケーションは、同期アプリケーション連携実行基盤のクライアントAPIを利用して作成します。
クライアントAPIを利用して業務アプリケーションを呼び出すには、以下の種類の方法があります。

■J2EE Connector ArchitectureのCommon Client Interface(CCI)による呼出し(Managed Environment)

J2EE Connector ArchitectureのManaged EnvironmentではConnectionFactoryをJNDI経由で取得します。

◆処理手順

  1. ConnectionFactoryの取得

  2. Connectionの取得

  3. Interaction(同期アプリケーション連携実行基盤の呼び出しが実装されたクラス)の作成

  4. MsyncInteractionSpecオブジェクトの作成

  5. MsyncInteractionSpecオブジェクトに対しサーバアプリケーションの各種情報設定

  6. RecordFactoryの取得

  7. Record(処理対象データを格納するクラス)の作成

  8. Recordに処理対象データを格納

  9. サーバアプリケーションの呼び出し(Interactionの実行)

  10. Interactionのクローズ

  11. Connectionのクローズ

処理手順の詳細については、J2EE Connector ArchitectureのCommon Client Interface(CCI)による呼出し(Managed Environment)の記述例(参考)を参考にしてください。

利用するインタフェース

以下のAPIを利用します。

注意

J2EE Connector ArchitectureのManaged Environmentで同期実行基盤アプリケーションを呼び出す場合、Resource Adapter Archive(RAR)ファイルの配備が必要です。配備手順については”セットアップガイド”の” クライアントアプリケーション(J2EE Connector Architecture Managed Environment)の環境作成”の”rarファイルの配備”を参照してください。

◆記述例

J2EE Connector ArchitectureのCommon Client Interface(CCI)による呼出し(Managed Environment)の記述例(参考)

クライアントアプリケーション、エラー処理のハンドリング

import javax.naming.InitialContext;
import javax.naming.NamingException;
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.MappedRecord;
import javax.resource.cci.RecordFactory;
import com.fujitsu.interstage.apfw.msync.ra.MsyncConnectionSpec;
import com.fujitsu.interstage.apfw.msync.ra.MsyncInteractionSpec;
...
public void doSomething(DataBean dataBean){
  ...
  try{
    // (1-1)InitialContextの作成
    InitialContext ic = new InitialContext();
    // (1-2)ConnectionFactoryの取得
    // 引数には、"java:comp/env/eis/***"という文字列を渡してください
    // ***は、配備時に指定したリソース名です。
    ConnectionFactory cf = (ConnectionFactory)ic.lookup("java:comp/env/eis/apfwibssc");
    // (1-3)ConnectionSpecの作成
    MsyncConnectionSpec cs = new MsyncConnectionSpec();
    cs.setBusinessName("wu001");
    // (2)Connectionの取得。
    Connection con = cf.getConnection(cs);
    // (3)Interactionの作成
    Interaction inter = con.createInteraction();
    // (4)InteractionSpecの作成
    MsyncInteractionSpec interSpec = new MsyncInteractionSpec();
    // (5-1)サーバアプリケーション名の設定
    interSpec.setTarget("apl");
    // (5-2)コンテキストIDの設定
    interSpec.setContextId("abcdef");
    // 入力データの作成
    // (6)RecordFactoryの取得
    RecordFactory rf = cf.getRecordFactory();
    // (7) Record(処理対象データを格納するクラス)の作成
    MappedRecord input = rf.createMappedRecord(null);
    MappedRecord output = rf.createMappedRecord(null);
    // (8) 処理対象データをMappedRecordに格納
    input.put("from_data", "abc");
    // (9)サーバアプリケーションの呼出し(Interactionの実行)
    // 第一引数には(4)で作成したMsyncInteractionSpecを渡してください
    // 第二引数には(8)で処理対象データを格納したMappedRecordを渡してください
    // 第三引数には(7)で作成した処理結果格納用のMappedRecordを渡してください
    inter.execute(interSpec, input, output);
    // 終了処理。
    // (10)Interactionのクローズ
    inter.close();
    // (11)Connectionのクローズ
    con.close();
    ...
  }
  catch(NamingException e){
    // ネーミングサービスのアクセスで発生した例外
    ...
  }
  catch(ResourceException e){
    // JCAインタフェースの実行で発生した例外
    ...
  }
}
...

処理の手順を以下に示します。

  1. ConnectionFactoryの取得
    InitialContext のlookup("java:comp/env/eis/apfwibssc")メソッドにより、ConnectionFactoryを生成します。
    MsyncConnectionSpecを作成して、業務名を指定します。

  2. Connectionの取得
    ConnectionFactoryのgetConnectionメソッドにより、業務名として指定したFactoryオブジェクトの所在をネーミングサービスに問い合わせます。さらにFactoryオブジェクトに定義したcreateメソッドを使用してサーバアプリケーションを呼び出すオブジェクトのインスタンスを生成します。

  3. Interaction(同期アプリケーション連携実行基盤の呼び出しが実装されたクラス)の作成
    ConnectionのcreateInteractionメソッドにより、Interactionを生成します。

  4. MsyncInteractionSpecオブジェクトの作成
    MsyncInteractionSpecを生成します。

  5. MsyncInteractionSpecオブジェクトに対しサーバアプリケーションの各種情報設定
    MsyncInteractionSpecのメソッドを使用して、サーバアプリケーション名やコンテキストIDなどを設定します。

  6. RecordFactoryの取得
    ConnectionFactoryのgetRecordFactoryメソッドにより、RecordFactoryを取得します。

  7. Record(処理対象データを格納するクラス)の作成
    RecordFactoryのcreateMappedRecordメソッドにより、MappedRecordを生成します。
    IndexedRecordを利用する場合、RecordFactoryのcreate IndexedRecordメソッドにより、IndexedRecordを生成します。

  8. Recordに処理対象データを格納
    MappedRecordに、サーバアプリケーションへ送信するデータを設定します。
    IndexedRecordを利用する場合、IndexedRecordに、サーバアプリケーションへ送信するデータを設定します。

  9. サーバアプリケーションの呼び出し(Interactionの実行)
    Interactionのexecuteメソッドにより、サーバアプリケーションを呼び出します。

  10. Interactionのクローズ
    Interactionをクローズします。

  11. Connectionのクローズ
    サーバアプリケーションを呼び出すオブジェクトのインスタンスを消去して、Connectionをクローズします。

■一般的なJavaアプリケーションからの呼出し

一般的なJavaアプリケーションからサーバアプリケーションを呼び出します。Servlet、JSP、およびEJBなどの一般アプリケーションからの呼出しが可能です。

処理手順

一般的なJavaアプリケーションから同期実行基盤アプリケーションを呼び出すプログラムの処理手順を示します。

  1. MsyncCallの作成

  2. コンテキストIDの設定

  3. サーバアプリケーションの呼出し

  4. removeメソッドの呼出し

これら手順の詳細については、を参考にしてください。

利用するインタフェース

以下のAPIを利用します。

エラー処理は、以下のAPIを利用します。
クライアントアプリケーションで利用する同期アプリケーション連携実行基盤のAPIを実行したときの、メソッドの動作に従ってエラー処理を記述します。同期アプリケーション連携実行基盤では、呼び出す方法によって、通知される例外が異なります。なお、Java標準の例外、および標準のエラーが発生する可能性がある場合は、別途catchする必要があります。
エラー処理のハンドリングについては、一般的なJavaアプリケーションからの呼出し、エラーのハンドリングの記述例(参考)を参考にしてください。

同期アプリケーション連携実行基盤のJava APIの詳細は、“ Interstage Business Application Server リファレンス”の“アプリケーションインタフェース(Java)”を参照してください。

記述例

一般的なJavaアプリケーションからの呼出し、エラーのハンドリングの記述例(参考)
import java.rmi.RemoteException;
import com.fujitsu.interstage.apfw.msync.MsyncCall;
import com.fujitsu.interstage.apfw.scnt.ApfwSystemException;
import com.fujitsu.interstage.apfw.scnt.ApfwUserException;
import com.fujitsu.interstage.apfw.conv.ApfwDataConversionException;
import com.fujitsu.interstage.apfw.msync.ApfwInvokeException;
...
public void doSomething(DataBean dataBean){
  // パラメタ設定用のUserBeanを生成
  UserBean bean = new UserBean();
  bean.setID(dataBean.getID());    // プロパティを設定
  ...

  try{
    // (1)MsyncCallの作成
    MsyncCall call = new MsyncCall("MyApp");        // 呼び出す業務名を指定
    // (2)コンテキストIDの設定
    call.setContextId("abcdef");
    // (3)サーバアプリケーションの呼出し
    UserBean response = (UserBean)call.invokeMsync(bean,"apl"); // 送信するデータとサーバアプリケーション名を指定して呼出し
      ...
    // (4) removeメソッドの呼出し
    call.remove();
  } catch (ApfwDataConversionException e) {
    // 変換中の例外など
    // invokeMsyncメソッドで発生する。
    ...
  } catch (ApfwInvokeException e) {
    // API内部の例外
    // invokeMsyncメソッドで発生する。
    ...
  } catch (RemoteException e) {
    // 通信中の例外
    // invokeMsyncメソッドで発生する。
    ...
  } catch (ApfwSystemException e) {
    // 同期アプリケーション連携実行基盤で発生した例外
    // invokeMsyncメソッドで発生する。
    ...
  } catch (ApfwUserException e) {
    // サーバアプリケーションで発生した例外
    // invokeMsyncメソッドで発生する。
    ...
  }
}
...

処理の手順を以下に示します。

  1. MsyncCallの作成
    業務名を指定してMsyncCallを作成します。MsyncCallクラスのコンストラクタが呼び出されるとクライアントAPIは指定したFactoryオブジェクトの所在をネーミングサービスに問い合わせます。さらにFactoryオブジェクトに定義したcreateメソッドを使用してサーバアプリケーションを呼び出すオブジェクトのインスタンスを生成します。

  2. コンテキストIDの設定
    setContextIdメソッドを呼び出し、コンテキストIDを設定します。コンテキストIDとして、文字列またはcom.fujitsu.uji.DispatchContextオブジェクトを指定します。com.fujitsu.uji.DispatchContextオブジェクトを指定した場合は、オンラインフレームワークから同期アプリケーション連携実行基盤へコンテキストIDを引き継ぎます。指定された文字列はinvokeMsyncメソッドでサーバアプリケーションを呼び出したときにサーバに渡されます。

  3. サーバアプリケーションの呼出し
    invokeMsyncメソッドで、サーバアプリケーションを呼び出します。invokeMsyncメソッドの引数に与えたデータとサーバアプリケーション名が、サーバに送信されます。第一引数と同じクラスのオブジェクトを生成し、サーバアプリケーションが返した結果とOUT値、INOUT値を格納して返します。データは、以下のどちらかを指定します。データを送信せずサーバアプリケーション名のみを指定したい場合は、プロパティを持たないbeanオブジェクトか空のMapオブジェクトを指定してください。

    • bean生成ツールまたはCOBOL開発支援ツールから生成したbean

    • java.util.Mapインタフェース実装クラス

  4. removeメソッドの呼出し
    removeメソッドが呼び出されると、サーバアプリケーションを呼び出すオブジェクトのインスタンスを消去します。

注意

サーバアプリケーションまたはサーバアプリケーションが動作するCORBAサービスを再起動した場合は、MsyncCallオブジェクトを再作成してください。
例外の詳細情報にCORBAサービスの例外情報とマイナーコードが出力された場合は、“Interstage Application Server メッセージ集”の“CORBAサービスの例外情報”および“CORBAサービスのマイナーコード”を参照してください。

コンテキストIDの設定

上記手順2で設定するコンテキストIDによって、クライアントAPI呼出し側とサーバとを対応付けることができます。呼出しごとに識別できる任意の文字列を指定してください。以下にサーブレットでのコンテキストの設定例を示します。

  // コンテキストID開始
  static final String        BEGIN_CONTEXTID = "[";
  // コンテキストID終了
  public static final String END_CONTEXTID   = "]";
  // 桁数合わせ用
  static final String[] ZEROS = {"", "0", "00", "000", "0000"};
  // セションIDの最大文字数
  static final int SESSIONID_MAX_LENGTH = 54;
  // 連番の最大文字数
  static final int REQUESTID_MAX_LENGTH = 3;
  // IPアドレスの最大文字数
  static final int REQUESTID_ADDRESS_LENGTH = 4;

  // コンテキストIDを生成
  String createContextId(HttpSession session){
    StringBuffer contextId = new StringBuffer(64);
    // WebサーバのIP下4桁
    String address = "";
    try{
      // 自ホストのアドレスを取得
      InetAddress localHost = InetAddress.getLocalHost();
      // IPアドレス文字列"%d.%d.%d.%d"を取得
      String hostAddress = localHost.getHostAddress();
      // 最後のピリオド以降の文字列を取得
      int lastIndexOf = hostAddress.lastIndexOf('.');
      address = hostAddress.substring(lastIndexOf + 1);
      contextId.append(ZEROS[REQUESTID_ADDRESS_LENGTH - address.length()]).append(address);
    }
    catch(Exception e){
      contextId.append("non");
    }
    // ServletセションIDを取得
    String sessionId = session.getId();
    int idLength = sessionId.length();
    if(idLength > SESSIONID_MAX_LENGTH){
      sessionId = sessionId.substring(idLength - SESSIONID_MAX_LENGTH);
    }
    contextId.append('-').append(sessionId);

    // 通番を取得
    int requestId = createRequestId();
    String requestIdString = Integer.toString(requestId);
    contextId.append('-').append(ZEROS[REQUESTID_MAX_LENGTH - requestIdString.length()]).append(requestIdString);
    return contextId.toString();
  }
  // 連番の最大値
  static final int MAX_REQUEST_COUNT = 999;

  // 通番を生成
  synchronized int createRequestId() {
    // 最大値まで達したらリセット
    if(requestCount == MAX_REQUEST_COUNT){

      requestCount = 0;
      return MAX_REQUEST_COUNT;
    }
    return requestCount++;
  }

ApcoordinatorアプリケーションからMsyncCallクラスを使用する場合、上記手順2でDispatchContextオブジェクトを指定してsetContextIdメソッドを呼び出すことで、ApcoordinatorアプリケーションのコンテキストIDを引き継ぐことができます。

public void doSomething(DispatchContext context, DataBean dataBean){
  ...
  // MsyncCallにコンテキストIDを設定する
  call.setContextId(context);
  ...
}

Apcoordinatorのリモート共通インタフェースによる呼出し

クライアントアプリケーションがApcoordinatorアプリケーションとして作成されている場合には、Apcoordinatorのリモート共通インタフェースを使用して、サーバアプリケーションを呼び出すことができます。これにより、EJBと共通のインタフェースによる呼出しが可能となります。
Apcoordinatorアプリケーションから同期実行基盤アプリケーションを呼び出すプログラムの処理手順を示します。

処理手順

  1. CallFactoryの取得

  2. Callの取得

  3. サーバアプリケーションの呼出し

これら手順の詳細については、Apcoordinatorのリモート共通インタフェースによる呼出しの記述例(参考)を参考にしてください。

利用するインタフェース

以下のApcoordinatorのリモート共通インタフェースを利用します。

エラー処理は、以下のAPIを利用します。
クライアントアプリケーションで利用する同期アプリケーション連携実行基盤のAPIを実行したときの、メソッドの動作に従ってエラー処理を記述します。同期アプリケーション連携実行基盤では、呼び出す方法によって、通知される例外が異なります。なお、Java標準の例外、および標準のエラーが発生する可能性がある場合は、別途catchする必要があります。
エラー処理のハンドリングについては、Apcoordinatorのリモート共通インタフェースによる呼出しの記述例(参考)を参考にしてください。

同期アプリケーション連携実行基盤上のオブジェクトの自動削除

以下のメソッドを実行したときには、同期アプリケーション連携実行基盤上にオブジェクトが作成されます。

これらのメソッドによって作成されたオブジェクトについては、以下の図に示すタイミングで同期アプリケーション連携実行基盤のdestroy()メソッドが呼び出され、オブジェクトが削除されます。

記述例

Apcoordinatorのリモート共通インタフェースによる呼出しの記述例(参考)

リモートマップに、呼び出す同期アプリケーション連携実行基盤の定義を行います。リモートマップで定義された論理名をプログラムで指定し、同期アプリケーション連携実行基盤の接続を行います。

<?xml version="1.0" encoding="iso-2022-jp"?>
<remoteMap
    xmlns="http://interstage.fujitsu.com/schemas/uji/remoteMap"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://interstage.fujitsu.com/schemas/uji/remoteMap
                        http://interstage.fujitsu.com/schemas/uji/remotemap.xsd">
  <config>
    <version>5.0</version>
  </config>

  <!-- 同期アプリケーション連携実行基盤の呼出しを定義します。-->
  <msync name="MyCobolApl" application="MyApp"/>

</remoteMap>

同期アプリケーション連携実行基盤をmsyncタグで記述し、applicationアトリビュートに業務名を指定します。その他のタグについてはApcoordinatorのマニュアルを参照してください。

リモートマップに、呼出す同期アプリケーション連携実行基盤の定義を行います。リモートマップで定義された論理名をプログラムで指定し、同期アプリケーション連携実行基盤の接続を行います。

import com.fujitsu.uji.ext.Call;
import com.fujitsu.uji.ext.CallFactory;
import com.fujitsu.uji.ext.UjiRemoteException;
import com.fujitsu.uji.ext.UjiTargetException;
import com.fujitsu.uji.ext.UjiCreateException;

public void doSomething(DispatchContext context, DataBean dataBean){
  // パラメタ設定用のUserBeanを生成
  UserBean bean = new UserBean();
  bean.setID(dataBean.getID());    // プロパティを設定
  ...
  try{
    // (1) CallFactoryの取得
    CallFactory factory = context.getCallFactory();
    // (2) Callの取得
    Call call = factory.createCall("MyCobolApl");        // 呼び出すアプリケーションを指定
    // (3) サーバアプリケーションの呼出し
    UserBean response = (UserBean)call.invoke(bean,"apl"); // 送信するデータとサーバアプリケーション名を指定して呼出し
    ...
  } catch (UjiCreateException e) {
    // createCallメソッドで発生した例外
    ...
  } catch (UjiRemoteException e) {
    // 通信中の例外
    // invokeメソッドで発生する。
    ...
  } catch (UjiTargetException e) {
    // サーバアプリケーションで発生した例外
    // invokeメソッドで発生する。
    ...
  }
}

処理の手順は以下のようになります。本方法を使用した場合、コンテキストIDはApcoordinatorにより自動的に設定されます。

  1. CallFactoryの取得
    DispatchContextクラスのgetCallFactoryメソッドで、CallFactoryインタフェースを取得します。

  2. Callの取得
    リモートマップに定義した名前を指定してCallFactoryのcreateCallメソッドを呼び出し、Callインタフェースを取得します。

  3. サーバアプリケーションの呼出し
    Callインタフェースのinvokeメソッドで、サーバアプリケーションを呼び出します。invokeメソッドの引数に与えたデータとサーバアプリケーション名が、サーバに送信されます。第一引数と同じクラスのオブジェクトを生成し、サーバアプリケーションが返した結果とOUT値、INOUT値を格納して返します。データは、以下のどちらかを指定します。データを送信せずサーバアプリケーション名のみを指定したい場合は、プロパティをもたないbeanオブジェクトか空のMapオブジェクトを指定してください。

    • bean生成ツールまたはCOBOL開発支援ツールから生成したbean

    • java.util.Mapインタフェース実装クラス

注意

サーバアプリケーションまたはサーバアプリケーションが動作するCORBAサービスを再起動した場合は、Callオブジェクトを再取得してください。
例外の詳細情報にCORBAサービスの例外情報とマイナーコードが出力された場合は、“Interstage Application Server メッセージ集”の“CORBAサービスの例外情報”および“CORBAサービスのマイナーコード”を参照してください。

MsyncCallFactoryクラスを使用して以下のように呼び出すと、リモートマップを使用しないでサーバアプリケーションを呼び出すことができます。

import com.fujitsu.uji.msync.MsyncCallFactory;
import com.fujitsu.uji.msync.UjiMsyncCall;

public void doSomething(DispatchContext context, DataBean dataBean){
  ...
  // (1) CallFactoryの取得
  MsyncCallFactory factory = (MsyncCallFactory)context.getCallFactory(MsyncCallFactory.MSYNC);
  // (2) Callの取得
  Call call = factory.createUjiMsyncCall("MyApp");        // 呼び出す業務名を指定
  // (3) サーバアプリケーションの呼出し
  UserBean response = (UserBean)call.invoke(bean,"apl"); // 送信するデータとサーバアプリケーション名を指定して呼出し
    ...

処理の手順は以下のようになります。本方法を使用した場合、コンテキストIDはApcoordinatorにより自動的に設定されます。

  1. CallFactoryの取得
    DispatchContextクラスのgetCallFactoryメソッドで、MsyncCallFactoryインタフェースを取得します。

  2. Callの取得
    業務名を指定してMsyncCallFactoryのcreateUjiMsyncCallメソッドを呼び出し、UjiMsyncCallクラスを取得します。

  3. サーバアプリケーションの呼出し
    UjiMsyncCallクラスのinvokeメソッドで、サーバアプリケーションを呼び出します。invokeメソッドの動作は引数に与えたデータとサーバアプリケーション名が、サーバに送信されます。第一引数と同じクラスのオブジェクトを生成し、サーバアプリケーションが返した結果とOUT値、INOUT値を格納して返します。データは、以下のどちらかを指定します。データを送信せずサーバアプリケーション名のみを指定したい場合は、プロパティを持たないbeanオブジェクトか空のMapオブジェクトを指定してください。

    • bean生成ツールまたはCOBOL開発支援ツールから生成したbean

    • java.util.Mapインタフェース実装クラス

注意

サーバアプリケーションまたはサーバアプリケーションが動作するCORBAサービスを再起動した場合は、Callオブジェクトを再取得してください。
例外の詳細情報にCORBAサービスの例外情報とマイナーコードが出力された場合は、“Interstage Application Server メッセージ集”の“CORBAサービスの例外情報”および“CORBAサービスのマイナーコード”を参照してください。

■J2EE Connector ArchitectureのCommon Client Interface(CCI)による呼出し(Non Managed Environment)

J2EE Connector Architecture対応クライアントAPIを利用して、サーバアプリケーションを呼び出します。Servlet、JSP、およびEJBなどの一般アプリケーションからの呼出しが可能です。
J2EE Connector Architecture対応クライアントAPIを利用して同期実行基盤アプリケーションを呼び出すプログラムの処理手順を示します。

処理手順

  1. ConnectionFactoryの取得

  2. ConectionSpecの取得

  3. Connectionの取得

  4. Interaction(同期アプリケーション連携実行基盤の呼び出しが実装されたクラス)の作成

  5. MsyncInteractionSpecオブジェクトの作成

  6. MsyncInteractionSpecオブジェクトに対しサーバアプリケーションの各種情報設定

  7. RecordFactoryの取得

  8. Record(処理対象データを格納するクラス)の作成

  9. Recordに処理対象データを格納

  10. サーバアプリケーションの呼び出し(Interactionの実行)

  11. Interactionのクローズ

  12. Connectionのクローズ

これら手順の詳細については、J2EE Connector ArchitectureのCommon Client Interface(CCI)による呼出しの記述例(参考)を参考にしてください。

利用するインタフェース

以下のAPIを利用します。

エラー処理は、以下のAPIを利用します。
エラー処理のハンドリングについては、J2EE Connector ArchitectureのCommon Client Interface(CCI)による呼出しの記述例(参考)を参考にしてください。

注意

マルチスレッドを利用する場合は、スレッド単位にManagedConnectionFactoryクラスのオブジェクトを生成してください。
サーバアプリケーションまたはサーバアプリケーションが動作するCORBAサービスを再起動した場合は、Connectionオブジェクトを再作成してください。
例外の詳細情報にCORBAサービスの例外情報とマイナーコードが出力された場合は、“Interstage Application Server メッセージ集”の“CORBAサービスの例外情報”および“CORBAサービスのマイナーコード”を参照してください。

記述例

J2EE Connector ArchitectureのCommon Client Interface(CCI)による呼出しの記述例(参考)

クライアントアプリケーション、エラー処理のハンドリング

import javax.resource.ResourceException;
import javax.resource.cci.Connection;
import javax.resource.cci.ConnectionFactory;
import javax.resource.cci.Interaction;
import javax.resource.cci.MappedRecord;
import javax.resource.cci.RecordFactory;
import com.fujitsu.interstage.apfw.msync.ra.MsyncConnection; 
import com.fujitsu.interstage.apfw.msync.ra.MsyncConnectionSpec;
import com.fujitsu.interstage.apfw.msync.ra.MsyncInteractionSpec;
import com.fujitsu.interstage.apfw.msync.raspi.MsyncManagedConnectionFactory;
import com.fujitsu.interstage.apfw.msync.ra.MsyncResourceException; 
...
public void doSomething(DataBean dataBean){
  ...
  try{
    // (1-1)ManagedConnectionFactoryの作成
    MsyncManagedConnectionFactory mcxf = new MsyncManagedConnectionFactory();
    // (1-2)ConnectionFactoryの作成
    ConnectionFactory cxf = (ConnectionFactory)mcxf.createConnectionFactory();
    // (2) ConectionSpecの取得
    MsyncConnectionSpec cs = new MsyncConnectionSpec();
    cs.setBusinessName(implID);
    // (3)Connectionの取得
    Connection con = cxf.getConnection(cs);
    // (4)Interactionの作成
    Interaction inter = con.createInteraction();
    // (5)InteractionSpecの作成
    MsyncInteractionSpec interSpec = new MsyncInteractionSpec();
    // (6-1)サーバアプリケーション名の設定
    interSpec.setTarget("apl");
    // (6-2)コンテキストIDの設定
    interSpec.setContextId("abcdef");
    // 入力データの作成
    // (7)RecordFactoryの取得
    RecordFactory rf = cxf.getRecordFactory();
    // (8)Record(処理対象データを格納するクラス)の作成
    MappedRecord input = rf.createMappedRecord(null);
    MappedRecord output = rf.createMappedRecord(null);
    // (9)処理対象データをMappedRecordに格納
    input.put("from_data", "abc");
    // (10)サーバアプリケーションの呼び出し(Interactionの実行)
    // 第一引数には(5)で作成したMsyncInteractionSpecを渡してください
    // 第二引数には(9)で処理対象データを格納したMappedRecordを渡してください
    // 第三引数には(8)で作成した処理結果格納用のMappedRecordを渡してください
    inter.execute(interSpec, input, output);
    // 終了処理
    // (11)Interactionのクローズ
    inter.close();
    // (12)Connectionのクローズ
    con.close();

    ...

  } catch (ResourceException e) {
    //J2EE Connector Architecture対応クライアントAPIを用いた呼び出しで発生した例外
    ...
  }
  ...
}

処理の手順を以下に示します。

  1. ConnectionFactoryの取得
    MsyncManagedConnectionFactoryを作成して、業務名を指定します。MsyncManagedConnectionFactoryのcreateConnectionFactoryメソッドにより、ConnectionFactoryを生成します。

  2. MsyncConnectionSpecの取得
    MsyncConnectionSpecを作成して、業務名を指定します。

  3. Connectionの取得
    ConnectionFactoryのgetConnectionメソッドにより、業務名として指定したFactoryオブジェクトの所在をネーミングサービスに問い合わせます。さらにFactoryオブジェクトに定義したcreateメソッドを使用してサーバアプリケーションを呼び出すオブジェクトのインスタンスを生成します。

  4. Interaction(同期アプリケーション連携実行基盤の呼び出しが実装されたクラス)の作成
    ConnectionのcreateInteractionメソッドにより、Interactionを生成します。

  5. MsyncInteractionSpecオブジェクトの作成
    MsyncInteractionSpecを生成します。

  6. MsyncInteractionSpecオブジェクトに対しサーバアプリケーションの各種情報設定
    MsyncInteractionSpecのメソッドを使用して、サーバアプリケーション名やコンテキストIDなどを設定します。

  7. RecordFactoryの取得
    ConnectionFactoryのgetRecordFactoryメソッドにより、RecordFactoryを取得します。

  8. Record(処理対象データを格納するクラス)の作成
    RecordFactoryのcreateMappedRecordメソッドにより、MappedRecordを生成します。

  9. Recordに処理対象データを格納
    MappedRecordに、サーバアプリケーションへ送信するデータを設定します。

  10. サーバアプリケーションの呼び出し(Interactionの実行)
    Interactionのexecuteメソッドにより、サーバアプリケーションを呼び出します。

  11. Interactionのクローズ
    Interactionをクローズします。

  12. Connectionのクローズ
    サーバアプリケーションを呼び出すオブジェクトのインスタンスを消去して、Connectionをクローズします。

Spring Frameworkからの呼び出し

Spring Frameworkから呼び出す場合には、MsyncJCACallクラスを使用します。

◆bean定義

bean定義ファイルに次のように設定します。

<jee:jndi-lookup id="targetConnectionFactory" jndi-name="eis/apfwibssc"/>
<bean id="connectionFactory" class="org.springframework.jca.cci.connection.ConnectionSpecConnectionFactoryAdapter">
	<property name="targetConnectionFactory" ref="targetConnectionFactory"/>
	<property name="connectionSpec">
		<bean class="com.fujitsu.interstage.apfw.msync.ra.MsyncConnectionSpec">
			<property name="businessName" value="wu001"/>
		</bean>
	</property>
</bean>
<bean id="jcacaller" class="com.fujitsu.interstage.apfw.springframework.jca.MsyncJCACall">
	<property name="connectionFactory" ref="connectionFactory"/>
</bean>

businessNameには呼び出し先の業務名(APFW_BUSINESS_NAME)を指定します。

◆処理手順

  1. Record(処理対象データを格納するクラス)の作成

  2. Recordに処理対象データを格納

  3. サーバアプリケーションの呼び出し(MsyncJCACallの実行)

処理手順の詳細については、Spring Frameworkからの呼出しの記述例(参考)を参考にしてください。

利用するインタフェース

以下のAPIを利用します。

エラー処理は、以下のAPIを利用します。
エラー処理のハンドリングについては、Spring Frameworkからの呼出しの記述例(参考)を参考にしてください。

注意

J2EE Connector ArchitectureのManaged Environmentで同期実行基盤アプリケーションを呼び出すため、Resource Adapter Archive(RAR)ファイルの配備が必要です。配備手順については、”セットアップガイド”の” クライアントアプリケーション(J2EE Connector Architecture Managed Environment)の環境作成”の”rarファイルの配備”を参照してください。

◆記述例

Spring Frameworkからの呼出しの記述例(参考)

クライアントアプリケーション、エラー処理のハンドリング

import javax.resource.cci.MappedRecord;
import com.fujitsu.interstage.apfw.springframework.MsyncJCACall;
import javax.resource.ResourceException;
import org.springframework.dao.DataAccessException;...
  ...
  MsyncJCACall jcacaller;
  ...
public void doSomething(DataBean dataBean){
  try{
    // (1) Record(処理対象データを格納するクラス)の作成
    MappedRecord input = jcacaller.createMappedRecord("input");
    MappedRecord output = jcacaller.createMappedRecord("output");
    // (2) 処理対象データをMappedRecordに格納
    input.put("from_data", "abc");
    // (3)サーバアプリケーションの呼出し(Interactionの実行)
    // 第一引数にはサーバアプリケーション名を渡してください
    // 第二引数には(2)で処理対象データを格納したRecordを渡してください
    // 第三引数には(1)で作成した処理結果格納用のRecordを渡してください
    jcacaller.execute("apl", input, output);
    ...
  }
  catch(DataAccessException e){
    // JCAインタフェースの実行で発生した例外
    ...
  }
}
...

処理の手順を以下に示します。

  1. Record(処理対象データを格納するクラス)の作成
    MappedRecordを生成します。

  2. MappedRecordに処理対象データを格納
    MappedRecordに、サーバアプリケーションへ送信するデータを設定します。

  3. サーバアプリケーションの呼び出し(MsyncJCACallの実行)
    MsyncJCACallのexecuteメソッドにより、サーバアプリケーションを呼び出します。