製品アップデイト - COP (COBOL Out of Process) Framework
1. はじめに
Micro Focus COBOL Out of Process (COP) Framework は、Net Express と Server Express に実装されている COBOL/Java連携機能をさらに拡張するミドルウェアです。
以下のCOBOL製品とともに動作します:
- Server Express 2.2 J
- Net Express 3.1 JapanizationPack ServicePack 1
COP Framework は、以下の 2つの構成要素からなります:
- COBOL Server
COBOL Server は、COBOLプログラムの実行を、Java VM の ‘Out of Process’ でつかさどるディスパッチャの働きをします。これによって、COBOLプログラムは、それを利用する WebSphere や Weblogic のような Javaアプリケーションサーバーとは独立したプロセスとして実行されます。
- COP Client
COP Client は、‘Out of Process’のCOBOLプログラムを使用するための100%ピュアJava APIを提供します。
COP Framework は、既に Net Express、Server Express が提供している mfcobol.jar パッケージに替わるものとして、COBOLとJavaを連携させるすべての用途で使用することができます。しかし、COP Framework は、以下のような場合に特に有益です:
- Servlet、JSP、または、Enterprise Java Bean から COBOLを使用し、COBOLの状態を保存したい場合:
- ほとんどの Javaアプリケーションサーバーはスレッドの再利用を行っています。ステートレスな COBOLプログラムの場合、このことは何ら問題となりませんが、アプリケーション がインプロセスで実行されていると、ステートレスでない COBOLプログラムは予期しない動作を起こすことがあります。これは、COBOLランタイムシステムが、プログラムの WORKING-STORAGEデータをスレッドに割り当てるために、同じプログラムを複数回呼び出す際に、前回と同じスレッドを 再利用しているか・いないかによって動作に相違が生じる場合があるからです。COP Framework は COBOLプログラムを‘Out of Process’で実行するため、この問題は発生しません。
- Javaアプリケーションサーバの内部で、使用する Java VMの構成が管理されている場合:
- たとえば WebSphere では、サーバのスタートアップ時に独自のJava VMの構成を必要とします。
- Javaの実装によっては、これを外部から構成することが困難です。とくに、mfcobol.jar パッケージを UNIX上で使用する場合、JavaトリガーとしてJVMが標準に提供している javaコマンドではなく、Micro Focus提供の cobjrun コマンドを使用する必要があるため、このための構成を Javaアプリケーションサーバーの環境設定に追加しなければなりません。COP Framework を使用する場合、このような構成追加は必要ありません。
- JNI を使用できない場合:
- Java の実行環境によっては、JNIのような 非Javaのネイティブアプリケーションの直接の使用が適切でないことがあります。例えば Enterprise Java Bean (EJB) から COBOLを呼び出す場合がこれに相当します。COP Framework を使用すれば、COBOLを起動する Javaプログラムは、ピュアJava で構築することができ、ネイティブを使用することがありません。
2. インストール
COP Framework は、Windows ZIP圧縮形式でダウンロードされます。 UNIXで使用する場合は、いったん Windowsで解凍してから バイナリでFTP転送してください。
展開後の構造は以下のようになっています:
- COP_Framework.html
- - この文書
- IBMWebSphereDeploy.pdf
- - デモサーブレットをWebSpere に展開する方法
- COPClient.jar
- - クライアントAPIを提供するパッケージ
- Server
- - COBOL Server のインストールイメージ
- doc
- - クライアントAPIの Javadocs
- JSPDemo
- - JSPからCOBOLを呼び出すデモ
- ServletDemo
- - ServletからCOBOLを呼び出すデモ
COBOL Server のインストール先ディレクトリを決定し、そこへ /Server 以下のファイルをコピーしてください。
クライアントAPIの COPClient.jar は、COBOL Server にも含まれていますので、適宜 Javaから CLASSPATH を張って使用します。また、COPClient.jar を適宜Java環境にコピーして使用することもできます。
3. 使用例
まず、もっとも簡単な COBOL呼び出し例を示します
ClientRequest request = new ClientRequest(); /* リモート COBOL Server の設定。ローカルで COBOL Serverを使用する場合には、 * 以下の記述となる。 */ request.setMachine(InetAddress.getLocalHost()); request.setPort(9200); /* COBOL Server への接続 */ request.connect();
/* プログラムの呼び出し */ int ReturnCode = request.cobcall("Hello"); /* COBOLプログラムの使用が終わったら、 */ request.disconnect();
次に、Javaから COBOLにパラメタを渡す方法を示します:
ClientRequest request = new ClientRequest(); /* リモート COBOL Server の設定。ローカルで COBOL Serverを使用する場合には、 * 以下の記述となる。 */ request.setMachine(InetAddress.getLocalHost()); request.setPort(9200); /* COBOL Server への接続 */ request.connect(); Integer OneInteger = new Integer(42); String OneString = "Hello to COBOL"; /* JavaからCOBOLに渡すパラメタリストの作成 * * COP Client 提供の ParameterList クラスを使用 * * String型の扱いに注意 */ ParameterList inParms = new ParameterList() .add(OneInteger) .add(new Pointer(OneString,20) ); /* COBOLからJavaに返されるパラメタリストを用意 * * 空オブジェクトを作成しておけばよい */ ParameterList outParms = new ParameterList(); /* プログラムの呼び出し */ int ReturnCode = request.cobcall("copdemo1", inParms, outParms); /* outParms に、COBOLから返却されたパラメタが格納されている * * これらを OneInteger, OneString に取り出す * * ここでも String型の扱いに注意 */ OneInteger = (Integer)outParms.getArgument(0); Pointer ptr2string = (Pointer)outParms.getArgument(1); OneString = new String(ptr2string.getBytes()); /* 結果を表示 */ System.out.println("Results!\n"); System.out.println("OneInteger = "+OneInteger.intValue()); System.out.println("OneString = "+OneString.toString()); /* COBOLプログラムの使用が終わったら、 */ request.disconnect();
呼び出される側のCOBOLは、例えば以下のようにパラメタを受け取ります:
linkage section. 01 OneInteger pic s9(9) comp-5. 01 OneString pic x(80). procedure division using OneInteger OneString.
4. COBOL Server の始動
COBOL Server の始動するには、まず Server Express または Net Express の Java相互運用性に関する環境変数の設定ができている必要があります。関連マニュアルを参照していかを確認してください:
- COBDIRなど一連の環境変数が Server Express または Net Express を使用するために正しく設定されている
- Java の環境変数が正しく設定されている
- Server Express または Net Express が提供している mfcobol.jar が CLASSPATHに追加されている
上記を確認した上で、以下のように COPServer.jar を起動します。
UNIX の場合は
cobjrun -classpath COPServer.jar:./COPClient.jar:$CLASSPATH com.microfocus.cobol.cop.RequestHandler [-nobanner] [-quiet] [-threadpoolsize <num>] [-backlogpause <num>] [ポート番号]
Windowsの場合は
java -classpath COPServer.jar;./COPClient.jar;%CLASSPATH% com.microfocus.cobol.cop.RequestHandler [-nobanner] [-quiet] [-threadpoolsize <num>] [-backlogpause <num>] [ポート番号]
(ポート番号は省略可能です。、省略時は 9200 になります)
[-nobanner] - スタート時のバナーメッセージを抑止する [-quiet] - 何のメッセージも出さない [-threadpoolsize <num>] - スレッドプールの数を指定する [-backlogpause <num>] - バックログ時の待機時間(ミリ秒単位)
上記のコマンドは、StartUp.sh (UNIX)、StartUp.bat (Windows) としても提供されています。
呼び出される COBOLプログラムは、まず COBPATH 環境変数に設定されたパスから探索され、次いで COBOL Server を始動したディレクトリの下が探索されます。
5. Javaプロパティを使用した Client/Server間の構成
ターゲットマシンとポート番号をグローバルに定義するために、以下の2つのJavaプロパテが提供されています。
プロパティ名 | デフォルト値 | デフォルト値が適用されるメソッド |
---|---|---|
com.microfocus.cobol.cop.port | 9200 (必ず 数値!) | ClientRequest.setPort() |
com.microfocus.cobol.cop.machine | localhost | ClientRequest.setMachine() |
6. FAQ
Q. もっと詳細が知りたい。
A. クライアント API のリファレンスとして、Javadocs
が提供されています。また、COP Frameworkには簡潔な例題プログラムが添付されています。
Q. RMI を使うのとどこが違うのでしょう?
A. COBOLアプリケーションがステートレスであれば RMI でも結構です。しかし RMI はスレッドの再利用をしますのでステートレスでないCOBOLプログラムでは誤動作の原因となります。
Q. すでに mfcobol.jar パッケージを使って開発したアプリケーションがあります。COP Frameworkへの移行は簡単ですか?
A. はい、それほど大きな変更は必要ありません。以下の点に注意してください。
- int型以外を返す cobcall (cobcall_String, cobcall_double など)は廃止になりました。返却値はパラメタを使用してください。
- BY_REFERENCE, BY_VALUE を指定するオプションは、COPParameterListオブジェクトの addメソッドのバリアントで指定するようになりました。また、COP Client APIでは、呼び出し側の Javaで outパラメタリストを参照するか・しないかでCOBOL側の変更を使用するかどうかを決定できます。
- String型を渡す際のポインタ操作は、呼び出すJava側で行うようになりました。こちらの方がプログラミングの負担がずっと軽くなります。COBOL側は単に PIC X で宣言するだけです。MFJ-STRING型を使用する必要はありません。
- runtime.lang の DataType インタフェースは、そのままcom.microfocus.cobol.cop.lang に提供されています。
Q. COP Framework を WARにパッケージするにはどうすればよいですか?
A. COPClient.jar を WEB-INF/lib にコピーしてください。
以下にパッケージ構造の例題を示します:
1477 Fri Aug 09 16:03:22 BST 2002 COPJspDemo.jsp 3061 Fri Aug 09 16:03:22 BST 2002 WEB-INF/classes/com/microfocus/demo/JspCOP/COPJspBean.class 34586 Fri Aug 09 16:03:22 BST 2002 WEB-INF/lib/COPClient.jar 185 Fri Aug 09 16:03:22 BST 2002 WEB-INF/web.xml 25 Fri Aug 09 16:03:22 BST 2002 META-INF/MANIFEST.MF
Q. COP Server 下の COBOLプログラムはどうやってデバッグできますか?
A. 最も簡単な方法は :
call "CBL_DEBUGBREAK"
を、サーバ側COBOLプログラムの PROCEDURE DIVISION の先頭に書くことです。
これによって、プログラムが Javaから呼び出される毎に COP Server側のセッションに
Animatorが起動し、デバッグができます。
Q. どうやって COP Server を終了しますか?
A. CTRL-C をタイプするか、kill してください。
注意: すべてのクライアントが処理を終了してからにしてください。
Q. サーバ側 COBOLはどのようにコンパイルすればよいですか?
A. REENTRANT"2" 指令を指定し、マルチスレッドランタイムを使用してください。
具体的には、UNIX の場合は以下のように CSO (呼び出し可能共有オブジェクト) にリンクします:
cob -tz myprog.cbl -C "REENTRANT(2)"
Windows の場合は、マルチスレッドランタイムをリンクインしたDLLにします:
cobolc myprog.cbl REENTRANT(2); cbllink -d -rM myprog.obj
などのようになります。