前へCOBOL から Java を呼び出す Java データ型次へ

第 4 章 Java から Object COBOL を呼び出す

この章では、Java プログラムから COBOL オブジェクトへアクセスする方法について説明します。これは、Java プログラムから手続き型 COBOL にアクセスするメソッドとは少し異なります (詳細は、「Java から手続き型 COBOL を呼び出す」 を参照してください)。また、COBOL を使用して Enterprise Java Beans を作成する方法についても説明します。

4.1 概要

Java プログラムから Java クラスと同様に呼び出すことができるクラスを Object COBOL に作成することができます。これは、Object COBOL クラスの各メソッドに対して関数を与える Java ラッパー クラスを使用して行います。

Java ラッパー クラス内の関数は、メソッドのパラメータをすべて Java 配列に渡し、次に Java クラス mfcobol.runtime のメンバー関数の 1 つを呼び出し、Object COBOL クラスのメソッドを呼び出して結果を戻します。次の図にこの流れを示します。

Java から COBOL の呼び出しへの関数呼び出しパス

図 3-1: Java から COBOL のメソッド呼び出しへの関数呼び出しのパス

これ以降、この章では Object COBOL クラスとその Java ラッパーの書き方を説明します。最後の項では、Enterprise Java Beans (EJB) として使用するのに適切な Object COBOL クラスを作成する場合に行う必要がある追加事項について説明します。

この技術を効果的に使用するには、少なくとも Java 言語の基本知識が必要です。Java については、Sun Microsystems の Java サイトを参照することをお勧めします。

4.2 はじめに

はじめに、COBOL ランタイム システムと Java ランタイム システムが相互に動作できるように環境を設定する必要があります。詳細は、「COBOL から Java を呼び出す」 の章の 「COBOL と Java の設定」 を参照してください。

4.2.1 Java 仮想マシン未サポート エラー

Java から COBOL を呼び出す場合は、Object COBOL Java サポートが cbljvm_*.dll モジュールのうちの 1 つをロードして、Java 仮想マシンへのインターフェイスにします。ロードされるファイルは、ユーザが使用する Java 仮想マシンによって異なり、Java プログラムを実行している Java 仮想マシンの名前をクエリーすることで選択されます。Object COBOL では、「COBOL から Java を呼び出す」の章の 「COBOL と Java の設定」 のリストにある Java 仮想マシンをサポートしています。

使用している Java 仮想マシンがサポート対象のリストにない場合は、「Java 仮想マシン未サポート」の致命的エラーを受け取ります。mfcobol.cobjvm という Java システム プロパティを、サポートされている Java 仮想マシンの名前に設定することで、特定の Java 仮想マシンのロードを強制することができます。たとえば、cbljvm_sun.dll に含まれている Sun Java 仮想マシンに対するサポートをロードするには、このプロパティを "sun" に設定します。

このプロパティは、次のように、Java プログラムを実行するコマンド行で設定できます。

java -Dmfcobol.cobjvm=name class

ここで name には使用するサポート モジュールの名前を指定します。たとえば、Sun Java 仮想マシンのサポートで Java クラス myclass を実行するには、次のように指定します。

java -Dmfcobol.cobvjm=sun myclass

「Java 仮想マシン未サポート」のエラーを受け取った場合は、最初に Sun Java 仮想マシンを試してください。多くの Java 仮想マシンが Sun 製です。

4.3 Object COBOL で Java クラスを作成する

Java から呼び出せるクラスを Object COBOL で書くには、次の操作を行う必要があります。

  1. プログラムに次の指令を設定します。
    $set ooctrl(+p-f)
  2. Object COBOL クラスは javabase から継承する必要があります。

  3. Object COBOL クラス用の Java ラッパー クラスを作成します。ラッパー クラスのクラス名は、Object COBOL クラスのファイル名と同じにします。

  4. Object COBOL クラスに作成する各メソッドには、対応するメソッドが Java ラッパー クラスに存在する必要があります。

  5. Windows プラットフォームで実装する場合は、.dll ファイル内でクラスをパッケージ化する必要があります。

    .int または .gnt へコンパイルされたクラスを使用することもできますが、この方法では 1 つのファイル内で複数のクラスをパッケージ化することができません。

4.3.1 COBOL サポートのインポート

Java ラッパー クラスが Object COBOL クラスと通信するために必要なサポートは mfcobol パッケージにあります。ラッパーには、次の文が含まれている必要があります。

import mfcobol.* ;

また、mfcobol.jar が Java クラスパス上にあることを確認してください。クラスパス上にない場合は、Java プログラムのコンパイルや実行を行うことができません (詳細は、「COBOL から Java を呼び出す」の章の「COBOL とJava の設定」 に説明されています)。

4.3.2 ラッパー クラス

Java ラッパー クラスは、mfcobol.runtimeObject または mfcobol.runtime を拡張します。これは、次のように、Java ラッパー クラスのインスタンスによって表現される Object COBOL インスタンスの存在期間に影響を与えます。

ラッパー クラスは、ラッピングしているCOBOL クラスのライブラリとファイル名で初期化される必要があります。初期化するには、Java ラッパー クラスに次のコードを含めます。

 static
 {
    cobloadclass("libname", "filename", "fullJavaClassName") ; 
 }

ここで、

libname Object COBOL クラスを含む .dll ファイルの名前を指定します。クラスが .dll ファイル内でパッケージ化されていない場合は、このパラメータをヌルのままにできます。たとえば、 .int または .gnt コードとして実行されている場合です。
filename Object COBOL クラスのファイル名を指定します。
FullJavaClassName Object COBOL に対応する Java クラス名を指定します。

mfcobol.runtime には、cobloadclass() メソッドが全部で 3 つあり、これらはそれぞれ少し異なる方法でライブラリ、COBOL ファイル、および Java ラッパー クラスを識別します。

4.3.3 メソッドの追加と削除

COBOL クラスに追加するすべてのメソッドには、対応する関数が Java ラッパー クラスに存在する必要があります。

Java 関数は、次の操作を行う必要があります。

  1. COBOL メソッドの呼び出しから発生する可能性のある例外を宣言します。

    デフォルトでは、例外は Exception (COBOL で例外を挙げる場合に発生) と COBOLException (COBOL ランタイム システムから発生) です。作成するクラスが Enterprise Java Bean として実装される場合や、Java RMI (リモート メソッド 起動) を使用して実装される場合は、RemoteException も追加する必要があります。

  2. Java から COBOL メソッドへ渡されるパラメータを含む Java 配列を構築します。

    パラメータは、Java から COBOL ランタイム システムに Java 配列で渡されます。

  3. クラス runtime.java にある cobinvoke_ メソッドまたは cobinvokestatic_ メソッドのいずれかを呼び出します。

    Java 関数からの戻り値に応じて、cobinvoke_ メソッド と cobinvokestatic_ メソッドがあります (たとえば、cobinvoke_int は int を戻します)。Object COBOL インスタンスを呼び出すには cobinvoke_ メソッドを使用します。Object COBOL クラスを呼び出すには cobinvokestatic_ メソッドを使用します。

    すべての cobinvoke_ 関数のリストについては、「Java ランタイム クラス ライブラリ」 を参照してください。 Windowsの[スタート]メニューの[プログラム]から、Net Expressのフォルダ内の[NetExpress オンラインマニュアル] を選択して、「クラス ライブラリ リファレンス」 のショートカット ボタンをクリックします。

    どの Java データ型が COBOL メソッドからの戻り値の種類にマップされるかを判断して、適切な cobinvoke_ 関数を選択する必要があります。詳細は、「Java データ型」 の章を参照してください。

Object COBOL クラス メソッドは Java ラッパーの静的関数へマップされます。

次の 2 つのコード サンプルは、COBOL インスタンス メソッドと、それに対応する Java ラッパーの関数を示しています。次は COBOL メソッドです。

 method-id. "myMethod".
     local-storage Section.
*>---USER-CODE。次で必要なローカル記憶域項目を追加。
     linkage Section.
     01 myParameter            pic x(4) comp-5.
     01 myReturnValue          pic x(4) comp-5.

    procedure division using by reference myParameter
                          returning myReturnValue.
*>---USER-CODE。次にメソッド実装を追加。
     exit method.
 end method "myMethod".

次は Java ラッパー メソッドです。

public  int myMethod (Integer myParameter) throws Exception, COBOLException, 
 RemoteException
 {
    // パラメータは配列で COBOL へ渡されます。
    Object[] params = {myParameter};
    return ((int) cobinvoke_int ("myMethod", params));
 }

通常の場合、メソッドの名前は Java ラッパー クラスおよび COBOL クラスと同じですが、必ず同じである必要はありません。これにより、Java ラッパーでメソッドのオーバーロードを実装できます。

メソッドのオーバーロードを行うと、同じ名前で、異なる型と数のパラメータを受け取るメソッドをいくつか使用することができます。Java は メソッドのオーバーロードをサポートしていますが、COBOL はサポートしていません。しかし、オーバーロードした関数を Java ラッパーへ追加して、異なる名前のメソッドを COBOL クラスで呼び出させることができます。

たとえば、次のように、オーバーロードした関数を Java ラッパー クラスに持つことができます。

public int add (int a, int b) 
{...}
public int add (int a, int b, int c)
{...}

COBOL クラスでは、これらをメソッド "add2" と "add3" へマップします。

4.3.4 COBOL からの例外の発生

COBOL コードから Java 例外を発生させることができます。例外オブジェクトは任意の Java クラスにすることができます。例外を発生させるメソッドは javasup クラスにあり、「クラス ライブラリ リファレンス」に説明されています。 Windowsの[スタート]メニューの[プログラム]から、Net Expressのフォルダ内の[NetExpress オンラインマニュアル] を選択して、「クラス ライブラリ リファレンス」 のショートカット ボタンをクリックします。

次のいずれかのメソッドを使用することができます。

invoke javasup "throwException" using aCOBOLProxy

ここで、

aCOBOLProxy には、Throwable 型の Java オブジェクトに対する COBOL プロキシを指定します。

または、

invoke javasup "throwNewException" using javaclassname description

ここで、

javaclassname には、発生させる Java 例外のクラスの名前を指定します。
description テキストによる例外の説明です。

4.4 COBOL Enterprise JavaBeans

Enterprise JavaBean (EJB) として使用する COBOL クラスを作成することができます。 Enterprise JavaBean は、アプリケーション サーバーで稼動するソフトウェア コンポーネントです。 セキュリティ、トランザクションの完全性と永続性など、Bean で必要なサービスはすべてアプリケーション サーバーが行うので、EJB はビジネス ロジックを実装する必要があるだけです。 本項を読むためにははじめに EJB について理解することが必要です。 EJB についての詳細は、Sun Microsystems の Java サイトを参照してください。

4.4.1 COBOL EJBの作成

COBOLクラスを EJB として作成するためには、次のファイルを作成します。

Enterprise JavaBean を生成ためには、次の 5 つのメソッドもクラス名.cbl に追加して記述する必要があります。

これらのメソッドは、すべての Enterprise JavaBeans によって実装されている SessionBean インターフェイスの一部です。これらのメソッドのうち、最初の 3 つにはコードを追加する必要があります。SetSessionContext へは、Java コンテキスト オブジェクトが COBOL クラスのインスタンス データの一部として格納されるようにします。

EJBCreate は EJB でオーバーロードが可能なメソッドであり、異なるパラメータを指定して、インスタンス化時に Java bean を初期化することができます。パラメータを受け取らない EJBCreate メソッドを EJB に追加し、対応する create メソッドをリモート インターフェイス クラス (クラス名Remote.java) に追加します。クラス名Remote.java の create メソッドは、リモート インターフェイス オブジェクトを戻します。

COBOL クラスに追加するメソッドは、Java ラッパー クラスとリモート インターフェイス クラスへも追加する必要があります。

4.4.2 COBOL EJB テンプレートの利用

Net Express 製品とともに提供されている、COBOL EJBテンプレートプロジェクトをテンプレートとしてプロジェクトのクローンを作成することによって、容易に COBOL Enterprise JavaBeans を作成することができます。

COBOL Enterprise JavaBeans テンプレートプロジェクトは、\NetExpress\BASE\SOURCE\TEMPLATE\EJB\EJBTPLT.APP にあります。使用方法の詳細は、同プロジェクト中の README.TXT を参照して下さい。


Copyright © 2000 MERANT International Limited. All rights reserved.
本書、ならびに使用されている固有の商標と商品名は国際法で保護されています。

前へCOBOL から Java を呼び出す Java データ型次へ