製品アップデイト - 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

などのようになります。

-----