インスタンス データに対する COBOLBean の使用

制約事項: 次の説明はネイティブ コードにのみ該当します。

com.microfocus.cobol.CobolBean クラスを使用すると、COBOL プログラムをスレッドセーフになるように書き直したり、Java アプリケーションからパラメーターを取り込むように書き直したりすることなく、CobolBean のインスタンスを COBOL プログラムの記憶域節のインスタンスに関連付けることができます。

たとえば、次の COBOL プログラムは、複数の Java クラスから cobcall() で呼び出されると、同じデータを共有します。

$set data-context
 working-storage section.
 01 address-rec pic x(30). 

 linkage section.
 01 lnk-address-rec pic x(30).

 procedure division.
    goback. 
 entry "setAddressBook" using lnk-address-rec.
    move lnk-address-rec to address-rec
    exit program returning 0. 
  entry "getAddressBook" using lnk-address-rec.
    move address-rec to lnk-address-rec
    exit program returning 0.

com.microfocus.cobol.CobolBean を拡張する Java クラスを作成すると、cobcall() のインスタンス (data-context) バージョンを利用できます。CobolBean.cobcall() で呼び出す COBOL プログラムは、RE-ENTRANT(1/2)、SERIAL などのスレッド化指令ではなく、常に DATA-CONTEXT 指令を使用してコンパイルする必要があります。DATA-CONTEXT 指令を指定すると、COBOL ランタイム システムが CobolBean.cobcall() から使用される場合に、常に新しい COBOL 作業場所節が割り当てられます。

次の例では、COBOL プログラムの共有データ bean1.getAddress() が bean2.getAddress() と等しければ、通常は問題が発生します。しかし、Java プログラムが CobolBean の cobcall() を使用しているため、COBOL 作業場所節が CobolBean と関連付けられます。

import com.microfocus.cobol.*;
import com.microfocus.cobol.lang.*;

public class MyBean extends com.microfocus.cobol.CobolBean
{
   private StringBuffer address = new StringBuffer(30);

   public MyBean() throws Exception
   {
     super();
     super.cobload("addbook");
   }

   public String getAddress() throws Exception
   {
     Pointer addressPointer = 
	       new Pointer(this.address.toString(),30);    
     super.cobcall("getAddressBook", 
	       new ParameterList().add(addressPointer));
     this.address.setLength(0);
     this.address.append(addressPointer.toString());
     return address.toString();
   }

   public void setAddress(String address) throws Exception
   {
     super.cobcall("setAddressBook", 
	       new ParameterList().add(new Pointer(address,30)));
   }

   public static void main(String[] args) throws Exception
   {
      MyBean bean1 =new MyBean();
      bean1.setAddress("Mr A");

      MyBean bean2 =new MyBean();
      bean2.setAddress("Mr B");

      System.out.println("bean1.getAddress="+
		                    bean1.getAddress());
      System.out.println("bean2.getAddress="+
		                    bean2.getAddress());
   }
}