![]() | COBOL から Java を呼び出す | Java データ型 | ![]() |
この章では、Java プログラムから COBOL オブジェクトへアクセスする方法について説明します。これは、Java プログラムから手続き型 COBOL にアクセスするメソッドとは少し異なります (詳細は、「Java から手続き型 COBOL を呼び出す」 を参照してください)。また、COBOL を使用して Enterprise Java Beans を作成する方法についても説明します。
Java プログラムから Java クラスと同様に呼び出すことができるクラスを Object COBOL に作成することができます。これは、Object COBOL クラスの各メソッドに対して関数を与える Java ラッパー クラスを使用して行います。
Java ラッパー クラス内の関数は、メソッドのパラメータをすべて Java 配列に渡し、次に Java クラス mfcobol.runtime のメンバー関数の 1 つを呼び出し、Object COBOL クラスのメソッドを呼び出して結果を戻します。次の図にこの流れを示します。

図 3-1: Java から COBOL のメソッド呼び出しへの関数呼び出しのパス
これ以降、この章では Object COBOL クラスとその Java ラッパーの書き方を説明します。最後の項では、Enterprise Java Beans (EJB) として使用するのに適切な Object COBOL クラスを作成する場合に行う必要がある追加事項について説明します。
この技術を効果的に使用するには、少なくとも Java 言語の基本知識が必要です。Java については、Sun Microsystems の Java サイトを参照することをお勧めします。
はじめに、COBOL ランタイム システムと Java ランタイム システムが相互に動作できるように環境を設定する必要があります。詳細は、「COBOL から Java を呼び出す」 の章の 「COBOL と 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 製です。
Java から呼び出せるクラスを Object COBOL で書くには、次の操作を行う必要があります。
$set ooctrl(+p-f)
.int または .gnt へコンパイルされたクラスを使用することもできますが、この方法では 1 つのファイル内で複数のクラスをパッケージ化することができません。
Java ラッパー クラスが Object COBOL クラスと通信するために必要なサポートは mfcobol パッケージにあります。ラッパーには、次の文が含まれている必要があります。
import mfcobol.* ;
また、mfcobol.jar が Java クラスパス上にあることを確認してください。クラスパス上にない場合は、Java プログラムのコンパイルや実行を行うことができません (詳細は、「COBOL から Java を呼び出す」の章の「COBOL とJava の設定」 に説明されています)。
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 ラッパー クラスを識別します。
COBOL クラスに追加するすべてのメソッドには、対応する関数が Java ラッパー クラスに存在する必要があります。
Java 関数は、次の操作を行う必要があります。
デフォルトでは、例外は Exception (COBOL で例外を挙げる場合に発生) と COBOLException (COBOL ランタイム システムから発生) です。作成するクラスが Enterprise Java Bean として実装される場合や、Java RMI (リモート メソッド 起動) を使用して実装される場合は、RemoteException も追加する必要があります。
パラメータは、Java から COBOL ランタイム システムに Java 配列で渡されます。
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" へマップします。
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 | テキストによる例外の説明です。 |
Enterprise JavaBean (EJB) として使用する COBOL クラスを作成することができます。 Enterprise JavaBean は、アプリケーション サーバーで稼動するソフトウェア コンポーネントです。 セキュリティ、トランザクションの完全性と永続性など、Bean で必要なサービスはすべてアプリケーション サーバーが行うので、EJB はビジネス ロジックを実装する必要があるだけです。 本項を読むためにははじめに EJB について理解することが必要です。 EJB についての詳細は、Sun Microsystems の Java サイトを参照してください。
COBOLクラスを EJB として作成するためには、次のファイルを作成します。
作成するクラスの COBOL ファイル。オプションで、クラス名と異なるファイル名を付けることができます。
Beanが実装するビジネスロジックは、すべてこの中のメソッドとして記述されます。
「4.3.3 メソッドの追加と削除」 で説明した方法で、上記の クラス名.cbl に対して機械的な操作で作成できる Java ラッパー クラス
Java ラッパーへのホーム インターフェイス。
Java ラッパーへのリモート インターフェイス。
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 ラッパー クラスとリモート インターフェイス クラスへも追加する必要があります。
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 データ型 | ![]() |