この章では、Micro Focus のリソースアダプタを使用するアプリケーションの開発手順を説明します。
手続き型 COBOL で作成したプログラムは、Interface Mapping Toolkit を使用すれば EJB としてエクスポーズできます。
最初にインターフェイスマッパーでインターフェイスを COBOL プログラムにマッピングします。 COBOL のエントリポイントまたはプログラム ID、および新しいインターフェイスに使用するパラメータを選択します。 Interface Mapping Toolkit によってマッピング情報がすべて保存され、COBOL サービスの呼び出しに使用できる EJB が生成されます。
続いて、作成したサービスインターフェイスをディプロイします。ディプロイする具体的な項目は次のとおりです。
サービスインターフェイスは、生成された EJB をディプロイしない環境や、J2EE 準拠のアプリケーションサーバを使用しない環境でも利用可能です。 ただし、その場合は接続管理が行われず、リソースアダプタを呼び出すコードを独自に作成する必要があります。
最後に、EJB を呼び出す Java クライアント (JSP など) を作成します。
実行時には、Java クライアントアプリケーションから要求を送信し、生成された EJB を呼び出します。 EJB は受信した要求をリソースアダプタを介して Enterprise Server に渡し、エクスポーズされている COBOL プログラムが Enterprise Server によって実行されます。 マッピング情報は実行時に、エクスポーズされている COBOL プログラムとの情報のやり取りに使用されます。 COBOL プログラムからの応答は Enterprise Server によって、リソースアダプタを介して EJB に送信され、そこからクライアントに返されます。
ディプロイ方法の詳細については、Enterprise Server の『ディプロイガイド』を参照してください。
COBOL 開発システムには、複数のリソースアダプタ (J2EE コネクタ) が付属しており、 これらのリソースアダプタによって、J2EE アプリケーションサーバ上の EJB と Enterprise Server 上の COBOL プログラム間の通信が可能になります。
EJB に Enterprise Server 上の COBOL プログラムとの通信を開始させるには、J2EE アプリケーションサーバ上にリソースアダプタをディプロイする必要があります。詳細については、Enterprise Server の『ディプロイガイド』で『EJB とリソースアダプタ』の章を参照してください。
Micro Focus のリソースアダプタは JCA (Java Connector Architecture) に準拠しており、 個々のアダプタが API として CCI (Common Client Interface) を実装しています。 JCA と CCI はどちらも Sun が策定した規格であり、EJB やその他の J2EE コンポーネントは準拠が義務付けられています。
要求がリソースアダプタを経由して送信される基本的な過程は次のとおりです。
Micro Focus のリソースアダプタは API として CCI を使用するため、生成された EJB を使用しないで、リソースアダプタを直接呼び出すことも可能です。後述する『J2SE 環境における管理されない状態での接続』の項を参照してください。
生成された EJB を呼び出して、COBOL サービスに必要なパラメータを EJB に渡すには、Java でクライアントソフトウェアを作成する必要があります。 このクライアントは JSP やサーブレット、またはその他のモジュールとして実装できます。
EJB インターフェイスは Interface Mapping Toolkit で定義されており、 通常は Java 開発ツールに EJB をインポートして、そこでインターフェイスを調べます。 その際には特に、出力パラメータに注意してください。 マッピングされたインターフェイスで (グループ項目や対応するカスタムレコードではなく) 複数の出力パラメータが渡される場合、これらの出力パラメータは EJB インターフェイス内のコンテナオブジェクトを通じて返されます。 Java 開発ツールでは、そのような出力パラメータの有無も確認できます。
実行時には、Java クライアントソフトウェアが EJB を呼び出し、EJB と Enterprise Server 間の情報のやり取りを通じて COBOL サービスが実行されます。
Java から COBOL プログラムにメッセージを送信する手段としては、Interface Mapping Toolkit で EJB を生成する方法が最も簡単です。 この方法では、生成した EJB を J2EE 準拠のアプリケーションサーバ環境にディプロイし、リソースアダプタと Enterprise Server 間の接続をアプリケーションサーバによって管理します。
リソースアダプタを呼び出して Enterprise Server に要求を送信するコードを独自に作成すれば、EJB と J2EE アプリケーションサーバを使用しないで、COBOL プログラムにメッセージを送信することができます。 その場合、接続は管理されない状態になります。 作成したコードは、J2EE アプリケーションサーバの環境ではなく、J2EE サーバのライブラリを含む Java 2 Standard Edition (J2SE) 環境で実行されます。
管理されない状態での接続をディプロイするために必要な設定は、Micro Focus のクラス群を含むディレクトリの classpath への登録だけです。詳細については、Enterprise Server の『ディプロイガイド』で『EJB とリソースアダプタ』の章を参照してください。
Java で作成するクライアントは、CCI に準拠する必要があります。 CCI では、リソースアダプタから Enterprise Server などの EIS (Enterprise Information Server) に接続するために必要な API が定義されています。 また、Micro Focus のリソースアダプタ専用の拡張クラスも使用可能です。
クライアントによる処理の大まかな流れは次のとおりです。
CCI で定義されている各クラスと、それらのメソッドの一部を次に示します。
com.microfocus.cobol.connector.cci パッケージには Micro Focus の拡張機能が含まれています。この拡張機能については、『J2EE Connector Class Library Reference』で説明しています。 com.microfocus.cobol.connector.cci パッケージ には、次のようなクラスとメソッドがあります。
以下のいくつかの項では、COBOL サービスを要求する Java プログラムのコード例を示します。 この Java プログラムは、CCI のインターフェイスを使用してリソースアダプタとの間で情報をやり取りし、リソースアダプタによって COBOL サービスに要求を渡します。 また、COBOL グループ項目を表す CCI カスタムレコードの使用方法も示しています。 この例では、Calculate という名前の COBOL プログラムからエントリポイント ADD を介し、再利用可能レコード Calculator を使用して、add サービスがマッピングされます。
COBOL の Calculate プログラムは、インターフェイスマッパーで Java インターフェイスにマッピングする必要があります。 Calculator パラメータを「再利用マッピング」ペインにドラッグし、続いて add オペレーションの「インターフェイスフィールド」ペインにドラッグします。 subtract、divide、multiply の各オペレーションでも、同じ操作を行います。このようにインターフェイスをマッピングするのは、アプリケーションサーバで管理されないクラスによって、CCI カスタムレコードの使用方法を示しているためです。
このプログラム例では、次の各 Java パッケージに含まれるクラスを使用します。
| javax.resource.cci | J2EE のコネクタアーキテクチャ仕様で定義されている CCI インターフェイス群 |
| com.microfocus.cobol.connector.spi | SPI (Service Provider Interface) インターフェイスを実装する Micro Focus リソースアダプタ専用のクラス群 |
| com.microfocus.cobol.connector.cci | CCI インターフェイスを実装する Micro Focus リソースアダプタ専用のクラス群 |
これらのパッケージは、コードにインポートすることをお奨めします。 次のような文をコード内に記述してください。
import com.microfocus.cobol.connector.spi.*; import com.microfocus.cobol.connector.cci.*; import javax.resource.cci.*;
次にサービスのコード例を示します。コードに続いて、主な行を詳しく説明しています。
1 try {
2 // CobolNoTxManagedConnectionFactory のインスタンスを生成
3 mcf = new CobolNoTxManagedConnectionFactory();
4 // 必要なフィールドを設定
5 mcf.setServerHost("localhost");
6 mcf.setServerPort("9003");
7 mcf.setTrace(new Boolean(false));
// ConnectionFactory のインスタンスを生成 (JNDI は使用しない)
8 cxf = (javax.resource.cci.ConnectionFactory)
mcf.createConnectionFactory();
9 // Cobol Connection ハンドルを取得
10 connection = cxf.getConnection();
11 initialize(connection, cxf, true);
12 // 対話通信のセットアップ
13 interaction = connection.createInteraction();
14 // 新しい対話設定の作成
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");
Enterprise Server がリソースアダプタからのメッセージ着信を監視するポート。
8 行目
cxf = (javax.resource.cci.ConnectionFactory)
mcf.createConnectionFactory();
3 行目で生成した CobolNoTxManagedConnectionFactory を使用して javax.resource.cci.ConnectionFactory クラスをインスタンス化しています。
10 行目
connection = cxf.getConnection();
javax.resource.cci.Connection クラスをインスタンス化しています。ConnectionFactory オブジェクトの getConnection メソッドを呼び出すと、CobolNoTxManagedConnectionFactory の設定が反映された Connection インスタンスのハンドルが取得されます。この接続ハンドルは常に 1 つの ManagedConnection にマッピングされます。
11 行目
initialize(connection, cxf, true);
接続を初期化しています。 この処理は省略できません。 引数 true は Enterprise Server 上の COBOL プログラムの状態を指定しています。 呼び出すたびにプログラムを初期状態で実行する場合は true、サービス呼び出しの間、同じ状態を保持させるには false に設定します。
13 行目
interaction = connection.createInteraction();
Connection オブジェクトの createInteraction() メソッドを呼び出し、javax.resource.cci.Interaction をインスタンス化しています。 Interaction オブジェクトの生成には Connection オブジェクトを使用します。生成した Interaction オブジェクトで Enterprise Server との通信を行います。
15 行目
CobolInteractionSpec iSpec =
new CobolInteractionSpec();
必要な対話通信の種類に応じて、専用のクラスをインスタンス化し、設定します。 この例では、com.microfocus.cobol.connector.cci.CobolInteractionSpec クラスを使用しています。 このクラスで、パラメータを渡す要求と方法を作成します。このクラスのインスタンスに、関数の名前と、索引レコード内の各引数の方向 (入力、出力、入出力) または引数 direction (カスタムレコードの場合) が保持されます。
16 行目
iSpec.setFunctionName("myservice.add");
Enterprise Server で実行するプログラムの名前を、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 に格納されています。
複数のカスタムレコード、またはカスタムレコードと 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_ONLY22 行目
interaction.execute(iSpec, calc, calc);
対話通信を実行します。 Interaction オブジェクトの execute() メソッドを呼び出すと、要求が Enterprise Server に送信されます。
28〜29 行目
interaction.close();
最後に Interaction と Connection をクローズします。Connection オブジェクトの close() メソッドは接続を終了するメソッドです。このメソッドを実行すると、リソースアダプタとの接続が解除されます。 このメソッドを実行する前に、必ず Interaction オブジェクトの close() メソッドを実行してください。
initialize メソッドのコードの一例を次に示します。
private void initialize(
javax.resource.cci.Connection con,
javax.resource.cci.ConnectionFactory cf,
boolean isInitial) {
try {
javax.resource.cci.Interaction ix =
con.createInteraction();
com.microfocus.cobol.connector.cci.CobolInteractionSpec
iSpec = new
com.microfocus.cobol.connector.cci.CobolInteractionSpec();
iSpec.setFunctionName("initialize");
javax.resource.cci.RecordFactory rf =
cf.getRecordFactory();
javax.resource.cci.IndexedRecord irec =
rf.createIndexedRecord("beanArgs");
irec.add(new Boolean(isInitial));
javax.resource.cci.Record orec =
ix.execute(iSpec, irec);
ix.close();
} catch(javax.resource.ResourceException ex) {
throw new javax.ejb.EJBException(
"initialize threw ResourceException: ", ex);
}
}
上記のサンプルでは、COBOL サービス (myservice.add) でグループレコード Calculator を使用しています。 リソースアダプタの CCI では、このグループレコードはカスタムレコードとして表されます。このグループレコードに対応するカスタムレコードクラス、Calculator.java のコード例を次に示します。
/*******************************************************
This is a file generated by Micro Focus Net Express 4.0
This file represents the Custom Class for Calculator
*******************************************************/
public class Calculator extends
com.microfocus.cobol.connector.cci.CustomRecord {
private java.math.BigDecimal arg1 =
java.math.BigDecimal.valueOf(0);
private java.math.BigDecimal arg2 =
java.math.BigDecimal.valueOf(0);
private java.math.BigDecimal result =
java.math.BigDecimal.valueOf(0);
private java.math.BigDecimal storage =
java.math.BigDecimal.valueOf(0);
public Calculator() {
}
public java.math.BigDecimal getArg1() {
return arg1;
}
public void setArg1(java.math.BigDecimal ___p) {
arg1 = ___p ;
}
public java.math.BigDecimal getArg2() {
return arg2;
}
public void setArg2(java.math.BigDecimal ___p) {
arg2 = ___p ;
}
public java.math.BigDecimal getResult() {
return result;
}
public void setResult(java.math.BigDecimal ___p) {
result = ___p ;
}
public java.math.BigDecimal getStorage() {
return storage;
}
public void setStorage(java.math.BigDecimal ___p) {
storage = ___p ;
}
public Object[] getParameters() {
Object[] objs = new Object[4];
objs[0] = arg1;
objs[1] = arg2;
objs[2] = result;
objs[3] = storage;
return objs;
}
public void setParameters(Object[] objs) {
arg1 = (java.math.BigDecimal)objs[0];
arg2 = (java.math.BigDecimal)objs[1];
result = (java.math.BigDecimal)objs[2];
storage = (java.math.BigDecimal)objs[3];
}
}
サービスのサンプルで使用される COBOL プログラム、CALCULATOR のコードを次に示します。
$set intlevel(4)
identification division.
program-id. calculate.
environment division.
data division.
working-storage section.
01 calmemory pic s9(9) comp-5 value 0.
linkage section.
01 calculator.
05 arg1 pic s9(19)v9(19) comp-3.
05 arg2 pic s9(19)v9(19) comp-3.
05 result pic s9(19)v9(19) comp-3.
05 storage pic s9(19)v9(19) comp-3.
procedure division.
exit program.
entry "add" using calculator.
move arg1 to result
add arg2 to result
add result to calmemory
move calmemory to storage
exit program.
entry "subtract" using calculator.
move arg1 to result
subtract arg2 from result
add result to calmemory
move calmemory to storage
exit program.
entry "multiply" using calculator.
move arg1 to result
multiply arg2 by result
add result to calmemory
move calmemory to storage
exit program.
entry "divide" using calculator.
move arg1 to result
divide arg2 into result
add result to calmemory
move calmemory to storage
exit program.
Copyright © 2004 Micro Focus International Limited.All rights reserved.