4 WebLogic ServerからCOMアプリケーションへの呼出し

この章では、WLS-to-COMアプリケーションの1つである、WebLogic jCOMを使用してWebLogic ServerからCOMオブジェクト上にメソッドを呼び出すアプリケーションを準備およびデプロイする方法を説明します。

注意:

WebLogic Server 12.2.1.4.0でWebLogic jCOMは非推奨になりました。jCOMは、JavaとCOMの統合が必要な中間ソリューションのための移行手段として提供されています。Oracleでは、Microsoftアプリケーションとの推奨される通信方法としてWebサービスおよびRESTを想定しています。このタイプの通信を使用するには、レガシーCOMアプリケーションを.NETに移行することをお薦めします。

この章の内容は以下のとおりです。

ネイティブ・モードの特別な要件

ネイティブ・モードを使用するWLS-to-COMアプリケーションには、特別な要件が2つあります。

  • COMアプリケーションをネイティブ・モードで実行するには、WebLogic ServerがCOMアプリケーション・マシンにインストールされている必要があります。

  • ネイティブ・モードで実行するには、WebLogic ServerがWindowsマシンで動作している必要があります。

WebLogic ServerからCOMアプリケーションを呼び出す主なステップ

この節では、WebLogic ServerからCOMアプリケーションへ呼び出す主なステップを簡単に説明します。詳細については、以降の節で説明します。

COM側

  1. COMアプリケーションをコード化します。「COMアプリケーションのコード化」を参照してください

  2. com2javaツールでCOMオブジェクトからJavaクラスを生成します。「com2java GUIツールでのJavaクラスの生成」を参照してください

  3. WebLogic Server用にクラスをパッケージ化します。「WebLogic Server用のJavaクラスのパッケージ化」を参照してください

  4. COMアプリケーションを起動します。「COMアプリケーションの起動」を参照してください

WebLogic Server側

  1. サーバー・リスニング・ポート上でCOM呼出しを有効化します。Oracle WebLogic Server管理コンソール・オンライン・ヘルプjCOMの有効化に関する項を参照してください。
  2. 他の関連するコンソール・プロパティを構成します。Oracle WebLogic Server管理コンソール・オンライン・ヘルプサーバー: プロトコル: jCOMに関する項を参照してください。

    WebLogic ServerとCOMアプリケーションがネイティブ・モードで通信するように選択した場合は、WebLogic Server管理コンソールでこれを有効化します。ネイティブ・モードを使用するかどうかを判断する際は、「DCOMモードとネイティブ・モード」を参照してください。

  3. 他のJavaオブジェクトと同じようにCOMオブジェクトを使用します。

COMアプリケーションの準備

以下の節では、WebLogic Serverがオブジェクトでメソッドを呼び出せるようCOMクライアントを準備する方法について説明します。

COMアプリケーションのコード化

必要に応じてCOMアプリケーションをコード化します。

com2java GUIツールでのJavaクラスの生成

COMタイプ・ライブラリに対してcom2java GUIツールを実行すると、COMタイプ・ライブラリ内のクラスとインタフェースに対応するJavaクラス・ファイルの集合が生成されます。

以降で、GUIツールでのJavaクラスの生成を示します。WebLogic jCOMツール全般の詳細は、「jCOMツールの詳細」を参照してください。

  1. com2java GUIツールを実行するには、次のステップに従います。

    1. WEBLOGIC_HOME/server/binディレクトリに移動します(または、このディレクトリをCLASSPATHに追加します)。

    2. COMマシンでコマンド・シェルを開き、com2java.exeファイルを起動します。

      > com2java
  2. 一番上のフィールドで適切なタイプ・ライブラリを選択し、「Javaパッケージ」テキスト・ボックスに、生成されたファイルを格納するパッケージの名前を入力します。com2javaツールは、特定のタイプ・ライブラリに対して指定した直前のパッケージ名を記憶しています。

  3. 「プロキシの生成」をクリックして、Javaクラス・ファイルを生成します。

WebLogic Server用のJavaクラスのパッケージ化

COMオブジェクトをEJBから呼び出す場合は、WebLogic Serverが検出できるように、com2javaで生成するクラス・ファイルをEJB .jarにパッケージ化する必要があります。生成したファイルは、特定のパッケージに格納します。たとえば、Excelタイプ・ライブラリのファイルをすべてexcelというJavaパッケージに格納できます。

EJB .jarファイルのパッケージ化の詳細は、Oracle WebLogic Server Enterprise JavaBeansバージョン2.1の開発EJBの実装を参照してください。

COMアプリケーションの起動

Javaクラス・ファイルを生成して適切にパッケージ化したら、COMアプリケーションを起動すれば、WebLogic Serverに公開するCOMオブジェクトをインスタンス化および実行できます。

com2javaにより生成されたJavaクラスの使い方

com2javaツールは、タイプ・ライブラリ内でCOMクラスを発見するたびにそのCOMクラスにアクセスするためのJavaクラスを生成します。生成されたJavaクラスは、複数のコンストラクタを持ちます:

  • デフォルト・コンストラクタ - 認証なしでローカル・ホスト上にCOMクラスのインスタンスを作成します

  • 2番目のコンストラクタ - 認証なしで特定のホスト上にCOMクラスのインスタンスを作成します

  • 3番目のコンストラクタ - 特定の認証でローカル・ホスト上にCOMクラスのインスタンスを作成します

  • 4番目のコンストラクタ - 特定の認証で特定のホスト上にCOMクラスのインスタンスを作成します

  • 最後のコンストラクタ - 戻されたオブジェクト参照(COMクラスのインスタンスを参照することがわかっています)をラップできます

以下にDataLabelProxyクラスから生成されたコンストラクタのサンプルを示します:

public DataLabelProxy() {} 

public DataLabelProxy(Object obj) throws java.io.IOException {
super(obj, DataLabel.IID); 
} 
protected DataLabelProxy(Object obj, String iid) throws
java.io.IOException 
{
super(obj, iid);
} 
public DataLabelProxy(String CLSID, String host, boolean
deferred) throws java.net.UnknownHostException,
java.io.IOException{ super(CLSID, DataLabel.IID, host, null); 
} 
protected DataLabelProxy(String CLSID, String iid, String host,
AuthInfo authInfo) throws java.io.IOException { super(CLSID,
iid, host, authInfo); 
} 

COMインタフェースからcom2javaにより生成されたJavaインタフェースの使い方

COMインタフェースのメソッドは、特定のインタフェースを介してオブジェクトの参照を戻すことができます。

たとえば、Excelタイプ・ライブラリ(Excel8.olb)は、_Application COMインタフェースを定義し、そのメソッドAddはCOM IDLで次のように定義されます。

[id(0x0000023c), propget, helpcontext(0x0001023c)] 
HRESULT Workbooks([out, retval] Workbooks** RHS); 

このメソッドは、Workbooks COMインタフェースを実装するオブジェクトの参照を返します。Workbooksインタフェースは_Applicationインタフェースと同じタイプ・ライブラリに定義されているので、com2javaツールは作成する_Application Javaインタフェースに次のメソッドを生成します。

/** * getWorkbooks. 
* 
* @return return value. An reference to a Workbooks 
* @exception java.io.IOException If there are communications problems. 
* @exception com.bea.jcom.AutomationException If the remote server throws an exception. */ 
public Workbooks getWorkbooks () throws java.io.IOException, com.bea.jcom.AutomationException;
It is revealing to look at the implementation of the method in the generated _ApplicationProxy Java class:
/** 
* getWorkbooks. 
* 
* @return return value. An reference to a Workbooks 
* @exception java.io.IOException If there are communications 
problems. 
* @exception com.bea.jcom.AutomationException If the remote 
server throws an exception. 
*/ 
public Workbooks getWorkbooks () throws java.io.IOException, 
com.bea.jcom.AutomationException{ com.bea.jcom.MarshalStream 
marshalStream = newMarshalStream("getWorkbooks"); 
marshalStream = invoke("getWorkbooks", 52, marshalStream); 
Object res = marshalStream.readDISPATCH("return value"); 
Workbooks returnValue = res == null ? null : new 
WorkbooksProxy(res); 
checkException(marshalStream, 
marshalStream.readERROR("HRESULT")); 
return returnValue;
}

この例にもあるように、getWorkbooksメソッドは生成されたWorkbooksProxy Javaクラスを内部的に利用します。前述のとおり、com2javaツールは、Workbooks戻り値型を持つメソッドを生成します。Workbooksインタフェースは_Applicationと同じタイプ・ライブラリに定義されているからです。

Workbooksインタフェースが異なるタイプ・ライブラリに定義されている場合、WebLogic jCOMは次のコードを生成します。

/** 
* getWorkbooks. 
* 
* @return return value. An reference to a Workbooks 
* @exception java.io.IOException If there are communications 
problems. 
* @exception com.bea.jcom.AutomationException If the remote server 
throws an exception. 
*/ 
public Object getWorkbooks () throws java.io.IOException, 
com.bea.jcom.AutomationException;
In this case, you would have to explicitly use the generated proxy class to access the returned Workbooks:
Object wbksObj = app.getWorkbooks(); 
Workbooks workbooks = new WorkbooksProxy(wbObj);