サービスの例

次にサービスのコード例を示します。コードに続いて、主な行を詳しく説明しています。

1      try {
2       // Get a Connection Factory instance
3       mcf = new CobolNoTxManagedConnectionFactory();
4       // set the appropriate fields.
5       mcf.setServerHost("localhost");
6       mcf.setServerPort("9003");

7       // Get a connection Factory (without using JNDI)
8       cxf = (javax.resource.cci.ConnectionFactory) 
               mcf.createConnectionFactory();

9       // Get a Cobol Connection Handle
10      connection = cxf.getConnection();
11      initialize(connection, cxf, true);

12      // Set up an interaction
13      interaction = connection.createInteraction();

14      // create a new interaction spec
15      CobolInteractionSpec iSpec = 
             new CobolInteractionSpec();
16      iSpec.setFunctionName("myservice.add");

17      javax.resource.cci.RecordFactory rf = 
             cxf.getRecordFactory();
18      Calculator calc = new Calculator();
19      calc.setArg1(new java.math.BigDecimal(10));
20      calc.setArg2(new java.math.BigDecimal(20));
21      iSpec.setArgument(0, com.microfocus.cobol.
             RuntimeProperties.BY_REFERENCE);

22      interaction.execute(iSpec, calc, calc);
23      System.out.println(
             "Input - Arg 1 was" + calc.getArg1());
24      System.out.println(
             "Input - Arg 2 was" + calc.getArg2());
25      System.out.println(
             "Result was" + calc.getResult());
26      System.out.println(
             "Memory was" + calc.getStorage());

28      interaction.close();
29      connection.close();
30      } catch( javax.resource.ResourceException re) 
        {
31        re.printStackTrace();
32        Exception le = re.getLinkedException();
33      }

3 から 6 行目:

mcf = new CobolNoTxManagedConnectionFactory();

前述した ManagedConnectionFactory クラスのインスタンスを生成しています。続いて、Java プログラムとリソース アダプター間の管理されない接続を対象に、このオブジェクトを使用して次の属性を設定します。

8 行目:

cxf = (javax.resource.cci.ConnectionFactory) 
           mcf.createConnectionFactory();

3 行目で生成した CobolNoTxManagedConnectionFactory を使用して javax.resource.cci.ConnectionFactory クラスをインスタンス化しています。

10 行目:

connection = cxf.getConnection();

javax.resource.cci.Connection クラスをインスタンス化しています。接続ファクトリ オブジェクトの getConnection メソッドを呼び出すと、CobolNoTxManagedConnectionFactory の設定が反映された Connection インスタンスのハンドルが取得されます。この接続ハンドルは常に 1 つの ManagedConnection にマップされます。

11 行目:

initialize(connection, cxf, true);

接続を初期化しています。この処理は省略できません。引数 true はエンタープライズ サーバー上の COBOL プログラムの状態を指定しています。呼び出すたびにプログラムを初期状態で実行する場合は、ブール値 (3 番目のパラメーター) を true に設定します。サービス呼び出しの間、同じ状態を保持させるには、この値を false に設定します。

13 行目:

interaction = connection.createInteraction();

Connection オブジェクトの createInteraction() メソッドを呼び出し、javax.resource.cci.Interaction をインスタンス化しています。Interaction オブジェクトの生成には Connection オブジェクトを使用します。生成した Interaction オブジェクトでエンタープライズ サーバーとの通信を行います。

15 行目:

CobolInteractionSpec iSpec = 
    new CobolInteractionSpec();

必要な対話通信の種類に応じて、専用のクラスをインスタンス化し、設定します。この例では、com.microfocus.cobol.connector.cci.CobolInteractionSpec クラスを使用しています。このクラスで、パラメーターを渡す要求と方法を作成します。このクラスのインスタンスに、関数の名前と、索引レコード内の各引数 (入力、出力、入出力) またはカスタム レコードの引数の方向が保持されます。

16 行目:

iSpec.setFunctionName("myservice.add");

エンタープライズ サーバーで実行するプログラムの名前を、setFunctionName メソッドで指定しています。

18 から 21 行目:

Calculator calc = new Calculator();
calc.setArg1(new java.math.BigDecimal(10));
calc.setArg2(new java.math.BigDecimal(20));
iSpec.setArgument(0, 
      com.microfocus.cobol.
      RuntimeProperties.BY_REFERENCE);

カスタム レコード クラスのオブジェクトを生成します。単独のカスタム レコードを引数として渡す場合は、このコードで十分です。カスタム レコードは EJB の生成時に自動的に生成されます。カスタム レコード用に生成されたソース ファイルが myproject\repos\myService.deploy\packageName (Windows) または に格納されています。

複数のカスタム レコード、またはカスタム レコードと Java の基本データ型を 1 つの引数として渡す場合には、索引レコードを使用する必要があります。たとえば、整数型の値とカスタム レコードをパラメーターとして渡す場合には、次のコードを使用します。

    javax.resource.cci.RecordFactory rf = 
          cxf.getRecordFactory();
    javax.resource.cci.IndexedRecord iRec = 
          rf.createIndexedRecord("IndexedIn");
    javax.resource.cci.IndexedRecord oRec = 
          rf.createIndexedRecord("IndexedOut");
    iRec.add(new Integer(5));
    iRec.add(calc);
    iSpec.setArgument(0, 
          com.microfocus.cobol.
          RuntimeProperties.BY_REFERENCE);

このコードによって引数の方向が設定されます。各引数には 0 を基数とする連番が付けられ、この番号が最初の引数として setArgument に渡されます。方向の有効値は次のとおりです。

    com.microfocus.cobol.RuntimeProperties.BY_REFERENCE
    com.microfocus.cobol.RuntimeProperties.BY_VALUE
    com.microfocus.cobol.RuntimeProperties.OUTPUT_ONLY

22 行目:

interaction.execute(iSpec, calc, calc);

対話通信を実行します。Interaction オブジェクトの execute() メソッドを呼び出すと、要求が Enterprise Server に送信されます。

28 から 29 行目:

interaction.close();

最後に Interaction と Connection をクローズします。Connection オブジェクトの close() は接続を終了するメソッドです。このメソッドを実行すると、リソース アダプターとの接続が解除されます。このメソッドを実行する前に、必ず Interaction オブジェクトの close() メソッドを実行してください。