次にサービスのコード例を示します。コードに続いて、主な行を詳しく説明しています。
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 プログラムとリソース アダプター間の管理されない接続を対象に、このオブジェクトを使用して次の属性を設定します。
mcf.setServerHost("localhost");
リソース アダプターが位置しているマシンの名前。
mcf.setServerPort("9003");
エンタープライズ サーバーがリソース アダプターからのメッセージ着信を監視するポート。
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) or myproject/repos/myService.deploy/packageName (UNIX) に格納されています。
複数のカスタム レコード、またはカスタム レコードと 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() メソッドを実行してください。