3 COMクライアント・アプリケーションからWebLogic Serverへの呼出し

この章では、COMクライアントからWebLogic Server のオブジェクト上のメソッドを呼び出すためにWebLogic jCOMを使用する方法について説明します。

注意:

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

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

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

COM-to-WLSアプリケーションをネイティブ・モードで実行するためには、WebLogic ServerをCOMクライアント・マシンにインストールする必要があります。

「ネイティブ・モードでのCOM-to-WLSアプリケーションの実行」を参照してください。

COMクライアントからWebLogic Serverを呼び出す主なステップ

この節では、COMクライアントからWebLogic Serverへの呼出しを行うための主なステップを簡単に説明します。詳細については、以降の節で説明します。

WebLogic Server側

  1. アーリー・バインディングを使用している場合、java2comツールを実行してJavaラッパー・クラスとインタフェース定義言語(IDL)ファイルを生成し、これらのファイルをコンパイルします。「JavaラッパーおよびIDLファイルの生成 - アーリー・バインディングのみ」を参照してください

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

  3. COMクライアントにサーバー・クラスへのアクセスを許可します。「アクセス制御の構成」を参照してください

  4. 他の関連するコンソール・プロパティを構成します。Oracle WebLogic Server管理コンソール・オンライン・ヘルプサーバー: プロトコル: jCOMに関する項を参照してください。

COMクライアント側

  1. jCOMツール・ファイルおよびWebLogic Serverクラス・ファイル(ネイティブ・モードの場合のみ)をインストールします。「必要なファイルのインストール」を参照してください
  2. ゼロ・クライアント・インストールの場合
  3. アーリー・バインディングを使用している場合
    • WebLogic Serverマシン上で生成されたIDLファイルを取得して、タイプ・ライブラリにコンパイルします。

    • タイプ・ライブラリとサービス提供の対象となるWebLogic Serverを登録します。

    上記のステップについては、「JavaラッパーおよびIDLファイルの生成 - アーリー・バインディングのみ」を参照してください

  4. レジストリにWebLogic Server JVMを登録します。ネイティブ・モードでWebLogic Serverと通信する場合、ここで設定します。「クライアント・マシン・レジストリへのWebLogic Server JVMの登録」を参照してください
  5. COMクライアント・アプリケーションをコード化します。「COMクライアント・アプリケーションのコード化」を参照してください
  6. COMクライアントを起動します。「COMクライアントの起動」を参照してください

WebLogic Serverの準備

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

JavaラッパーおよびIDLファイルの生成 - アーリー・バインディングのみ

  1. JDKライブラリへのパスとweblogic.jarへのパスをCLASSPATHに追加します。次に例を示します。
    cd %WL_HOME%\server\bin
    setWLSEnv.cmd
    
  2. java2comツールでjavaラッパー・ファイルとIDLファイルを生成します。
    java com.bea.java2com.Main
    

    java2com GUIが表示されます。

  3. 次のように入力します。

    Name of generated IDL File: IDLファイルの名前

    Output Directory: ドライブ文字とルート・ディレクトリ\TLB

    TLBはOLEタイプ・ライブラリです。

    java2comツールは、指定されたクラスとメソッド・パラメータで使用される他のすべてのクラスを参照します。この作業は再帰的に行われます。ここでは、複数のクラスまたはインタフェースをスペースで区切って指定できます。

    抽象クラスではなく、パラメータ・コンストラクタを持たないJavaのパブリック・クラスはすべて、COMクラスとしてアクセス可能になります。他のパブリック・クラス、およびすべてのパブリック・インタフェースは、COMインタフェースとしてアクセス可能になります。

アクセス制御の構成

COMクライアント・アプリケーションがアクセスする必要のあるクラスへのアクセス権をCOMクライアント・ユーザーに付与します。特定のアプリケーションによって、どのクラスを公開するかが決まります。

たとえば、COMクライアントが次の3つのクラスにアクセスする必要があるとします。

  • java.util.Collection

  • java.util.Iterator

  • ejb20.basic.beanManaged

java.util.Collectionおよびjava.util.Iteratorへのアクセスの許可
  1. WebLogic Server管理コンソールの左ペインで「サービス」ノードをクリックしてから、その下の「jCOM」ノードをクリックします。
  2. 右ペインで、「新規」をクリックして次のように入力します。
    java.util.*
    
  3. 「OK」をクリックします。
  4. 「jCOMクラスのサマリー」ページで、クラス「name java.util.*」をクリックします。
  5. 「新規」をクリックして、新規のロールを作成します。
  6. 新規に作成したロール名をクリックして、このロールを構成します。
ejb20.basic.beanManagedへのアクセスの許可

ejb20.basic.beanManagedへのアクセスを許可するには、ステップ3のjava.util.*をejb20.basic.beanmanagedに置き換えて、「java.util.Collectionおよびjava.util.Iteratorへのアクセスの許可」,のステップを繰り返します。

COMクライアントの準備

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

必要なファイルのインストール

WebLogic Serverオブジェクト上のメソッドを呼び出すために、クライアント・マシンにインストールしておく必要のあるファイルが多数あります。以下に示すように、このうち一部のファイルは、ネイティブ・モードでメソッドを呼び出す場合にのみ必要です。

jCOMツール・ファイル

jCOMツールを実行するために必要な5つのファイルと3つのフォルダ(全サブフォルダおよびファイルを含む)があります。これらのファイルは、WebLogic ServerがインストールされているマシンのWL_HOME\server\binディレクトリに格納されています。ファイルは次のとおりです。

  • JintMk.dll

  • ntvinv.dll

  • regjvm.exe

  • regjvmcmd.exe

  • regtlb.exe

  • regjvm (全サブフォルダおよびファイルを含む)

  • regjvmcmd (全サブフォルダおよびファイルを含む)

  • regtlb (全サブフォルダおよびファイルを含む)

「jCOMツールの詳細」を参照してください。

WebLogic Serverクラス・ファイル - ネイティブ・モードのみ

ネイティブ・モードでCOM-to-WLSアプリケーションを実行するには、COMクライアント・マシンが特定のWebLogic Serverクラス・ファイルにアクセスできる必要があります。これらのファイルを取得するには、各COMクライアント・マシンにWebLogic Serverをインストールします。

WebLogic Serverサーブレットからのオブジェクト参照モニカーの取得 - ゼロ・クライアントのみ

オブジェクト参照モニカー(ORM)は、WebLogic Serverから取得できます。COMクライアント・アプリケーションからモニカーを使用できるので、regjvmcmdを実行する必要がなくなります。新規サーバーを作成しても、サーバーのホストとポートが同じであるかぎりモニカーは有効なままです。

COMクライアント・コードに対してORMを取得する方法が2つあります。

  • WebLogic Server上で実行しているサーブレットを通じて、それを取得します。WebLogic Server上でWebブラウザを開き、http://[wlshost]:[wlsport]/bea_wls_internal/comに移動します。

    ここでwlshostはWebLogic Serverマシンを示し、wlsportはサーバーのポート番号を示します。

  • WebLogic Serverマシンの完全な名前またはTCP/IPアドレスと、ポート番号をパラメータとして指定して、com.bea.jcom.GetJvmMoniker Javaクラスを実行します。

    java com.bea.jcom.GetJvmMoniker [wlshost] [wlsport]

    objrefモニカーを示し、その使用方法を説明する長いメッセージが表示されます。また、表示されるテキストは自動的にクリップボードにコピーされるので、ソースに直接貼付けできます。戻されたobjrefモニカーを使用すれば、指定したマシンおよびポート上のWebLogic Serverインスタンスにアクセスできます。

JavaラッパーおよびIDLファイルの生成 - アーリー・バインディングのみ

クライアント側に割り当てられたラッパー・ファイルおよびインタフェース定義言語(Interface Definition Language: IDL)ファイルの生成を実行します。

  1. IDLをクライアント・マシンにコピーします。

    WebLogic Server上でjava2comツールの実行(「WebLogic Serverの準備」を参照)に成功した場合、IDLファイルがサーバー・マシン上に作成されています。このIDLファイルをクライアント・マシンにコピーして、このCOMアプリケーションの\TLBサブディレクトリに配置します。

    注意:

    同じマシン上でクライアントとサーバーを実行している場合、このステップは必要ありません。java2comツールの出力は、サンプルの\TLBサブディレクトリに書き込まれます。

  2. IDLファイルをコンパイルして、タイプ・ライブラリを作成します。
    midl containerManagedTLB.idl
    

    このコマンドでMicrosoft IDLコンパイラMIDL.EXEを呼び出して、コンパイルを実行します。コンパイルの結果、containerManagedTLB.tlbというタイプ・ライブラリが作成されます。

  3. タイプ・ライブラリを登録し、サービスの対象となるJVMを設定します。
    regtlb /unregisterall
    regtlb containerManagedTLB.tlb registered_jvm 
    

    1行目は、登録済みのタイプ・ライブラリ・バージョンの登録を解除するためにregtlb.exeを呼び出します。2行目は、新しくコンパイルされたタイプ・ライブラリを登録します。

    regtlbに渡される2番目のパラメータregistered_jvmは重要です。これは、タイプ・ライブラリにリンクされるJVMの名前を指定します。WebLogic jCOMランタイムでは、タイプ・ライブラリで定義されたオブジェクト呼出しを適切なラッパー・クラスにリンクするために、この情報が必要です。

WebLogic Server JVMは、regjvmツールを通じてクライアント・マシンのレジストリに登録されます。「クライアント・マシン・レジストリへのWebLogic Server JVMの登録」を参照してください

ラッパー・ファイルに関する注意
  • 一般にラッパー・ファイルはサーバー上に配置し、コンパイルしておく必要があります。IDLファイルはクライアント上に配置し、コンパイルしておく必要があります。サーバーとクライアントが別々のマシンに存在するときに、クライアント側でラッパーとIDLを作成した場合、コンパイルしたラッパー・ファイルをサーバーに配布する必要があります。サーバー側でラッパーとIDLを作成した場合、IDLファイルをコンパイルしてタイプ・ライブラリを作成することが可能なクライアントにIDLファイルを移動する必要があります。

  • ラッパー・ファイルとIDLファイルは、java2comツール1回実行することで作成する必要があります。サーバー上とクライアント上の両方でjava2comツールを別々に実行しようとすると、作成されたラッパー・ファイルとIDLファイルが通信できなくなります。IDLとラッパーは識別のために一意なスタンプを持ちます。ラッパーはjava2comツールの共通呼出しから作成されるIDLファイルとのみ通信できます。IDLファイルも、通信できるのは同じ条件で作成されたラッパーだけです。その結果、java2comツールを1回実行する必要があり、作成されるファイルは後で分散されます。Javaソース・コードに間違いがある場合や変更を加えるために、java2comツールを再度実行する必要がある場合は、すべてのラッパー・ファイル、IDLファイル、およびTLBファイルを削除し、ステップをすべてやり直す必要があります。

  • java2comツールを使用して非推奨のメソッドを含む(または参照する)クラスのラッパーを作成する場合、コンパイル時に非推奨の警告が表示されます。これらの警告は無視できます。WebLogic jCOMは、メソッドをCOMからアクセス可能にします。

  • 生成されたラッパー・クラスは、CLASSPATHに含める必要があります。単にEJB jarに含めることはできません。

クライアント・マシン・レジストリへのWebLogic Server JVMの登録

サーバー名をWindowsレジストリに追加し、その名前をTCP/IPアドレスおよびWebLogicが受信するCOMリクエストをリスニングするクライアント・サーバー間の通信ポートに関連付けることで、ローカルJava仮想マシンに登録します。デフォルトは、localhost:7001です。

  1. regjvm GUIツールを呼び出すと、次の画面が表示されます。
  2. WebLogic Serverがローカル・ホスト以外で実行しており、7001以外のポートをリスニングしている場合、ホスト名(またはIPアドレス)およびポート番号を入力します。

    regjvmのコマンド・ライン・バージョンを使用することもできます。

    regjvmcmd servername localhost[7001]

JVMの登録解除

regjvm(またはregjvmcmd)ツールでは、古いエントリと同名の新しいエントリが入力されても、古いエントリは上書きされません。したがって、通信するマシンのホスト名またはポートを変更する必要がある場合は、古いエントリの登録を解除して新しいエントリを作成します。

Regjvmツール・ウィンドウでJVMを登録解除するには、登録を解除するJVMを選択して、「削除」を選択します。

別の方法として、コマンド・ライン・ツールregjvmcmdからJVMの登録を解除します。

regjvmcmd /unregister servername
ネイティブ・モードを選択している場合

COMクライアントをネイティブ・モードで実行している場合、「regjvm」ウィンドウで「ネイティブ・モード」または「ネイティブ・モード(アウト・オブ・プロセス)」ラジオ・ボタンをクリックするか、または/nativeパラメータを使用してregjvmcmdを呼び出します。このステップに関する詳細については、「ネイティブ・モードでのCOM-to-WLSアプリケーションの実行」を参照してください

COMクライアント・アプリケーションのコード化

これで、WebLogic Serverオブジェクト上のメソッドを呼び出すことができます。これをコード化する方法は、レイト・バインディングを選択するか、アーリー・バインディングを選択するかによって異なります。

レイト・バインド・アプリケーション

次に示すVisual Basicアプリケーションのサンプルからの抜粋では、Account EJBのホーム・インタフェースmobjHomeのCOMバージョンの宣言に注意してください。このCOMオブジェクトは、サーバー側にあるAccountHomeインタフェースのインスタンスにリンクされます。

Dim mobjHome As Object 
Private Sub Form_Load()
'Handle errors 
On Error GoTo ErrOut '
Bind the EJB AccountHome object through JNDI 
Set mobjHome = CreateObject("examplesServer:jndi:ejb20-containerManaged-AccountHome")
レイト・バインド・クライアントの確認済みの問題と回避策

オーバーロードされていながらパラメータの数が同じメソッドを処理する場合、WebLogic jCOMには問題があります。オーバーロードされたメソッド内のパラメータ数が異なる場合、そのような問題はありません。

パラメータ数が同じ場合には、呼出しに失敗します。

メソッドInitialContext.lookupはオーバーロードされています。

public Object lookup(String) 
public Object lookup(javax.naming.Name) 

ルックアップを実行するには、オブジェクトを作成するために特別なJNDIモニカーを使用する必要があります。

Set o = CreateObject("servername:jndi:objectname") 
アーリー・バインド・アプリケーション

アーリー・バインド・コードの最も顕著な特徴は、As Objectで宣言される変数の数が少ないことです。以前生成したタイプ・ライブラリを使用することにより、ここでオブジェクトを宣言できます。

「JavaラッパーおよびIDLファイルの生成 - アーリー・バインディングのみ」で生成した型ライブラリを使用してオブジェクトを宣言しますこのVisual Basicコードからの抜粋では、IDLファイルはcontainerManagedTLBと呼ばれ、EJBはExamplesEjb20BasicContainerManagedAccountHomeと呼ばれます。

Dim objNarrow As New containerManagedTLB.JCOMHelper

ここで、オブジェクトのメソッドを呼び出すことができます。

Set mobjHome = objNarrow.narrow(objTemp, "examples.ejb20.basic.containerManaged.AccountHome")

COMクライアントの起動

COMクライアント・アプリケーションを起動します。

ネイティブ・モードでのCOM-to-WLSアプリケーションの実行

COM-to-WLSアプリケーションでは、ネイティブ・モードに「イン・プロセス」と「アウト・オブ・プロセス」の区別があります。

  • アウト・オブ・プロセス - JVMは独自のプロセス内で作成され、COMプロセスとWebLogic Server JVMプロセスの間でプロセス間通信が発生します。

  • イン・プロセス - WebLogic Server JVM全体がCOMプロセスに取り込まれます。つまり、COMクライアントのアドレス空間にロードされます。WebLogic Serverクライアント側クラスはこのJVM内に配置されています。

アプリケーションで使用するプロセスを指定するには、regjvm GUIツール・インタフェースで「ネイティブ・モード(イン・プロセス)」または「ネイティブ・モード」ラジオ・ボタンを選択します。

アウト・オブ・プロセスでJVMを実行するネイティブ・モード

JVMをアウト・オブ・プロセスで実行する(ただし、ネイティブ・コードを使用してCOMクライアントに中のJavaオブジェクトへのアクセスを許可する)場合、次のステップに従います。

  1. regjvm GUIツールを呼び出して、JVMをネイティブとして登録します。regjvmでは、WebLogic jCOMのCOM-to-WLSメカニズムの動作を円滑化にするために、様々なレジストリ・エントリが登録されます。JVMを登録する場合には、「JVM id」フィールドにサーバーの名前を指定する必要があります。たとえば、exampleServerでJCOMネイティブ・モードが有効になっている場合は、regjvmを使用して登録する際に、「JVM id」ボックスにexampleServerと入力します。
  2. JVMが実行されていない場合は、「詳細」ラジオ・ボタンをクリックして、「起動コマンド」フィールドにJVMのパスを入力します。

    regjvmツールの詳細は、「jCOMツールの詳細」を参照してください。

  3. アプリケーション・コードのmainセクションに次のコードを挿入して、WebLogic jCOMランタイムにJVMが呼出しを受け取る準備ができていることを知らせます。
    com.bea.jcom.Jvm.register("MyJvm"):
    public class MyJvm {
    public static void main(String[] args) throws Exception {
    // Register the JVM with the name "firstjvm"
    com.bea.jcom.Jvm.register("firstjvm");
    Thread.sleep(6000000); // Sleep for an hour
    }
    
  4. これで、Visual Basicからレイト・バインディングを使用して、JVMにロードできるJavaクラスのインスタンスをインスタンス化できます。
    Set acctEJB = CreateObject("firstjvm.jndi.ejb20.beanManaged.AccountHome")
    
  5. JVMを登録したら、標準WebLogic jCOM regtlbコマンドを使用してJavaオブジェクトにアーリー・バインド・アクセスします(regtlb はパラメータとしてタイプ・ライブラリの名前とJVM名を取り、そのタイプ・ライブラリに定義されているすべてのCOMオブジェクトをそのJVMに存在するものとして登録します)。

    また、独自のインスタンシエータ(com.bea.jcom.Jvm.register(...)への追加パラメータ)をJVMに関連付けることによって、COMクライアントのかわりにJavaオブジェクトのインスタンス化を制御できます。これは、オブジェクト・ファクトリの一種です。

イン・プロセスでJVMを実行するネイティブ・モード

このテクニックを使用すると、実際にJVMをCOMクライアントのアドレス空間にロードできます。

再びregjvmコマンドを使用します。ただし、今度は追加パラメータを指定します。

注意:

JVMを登録する場合には、「JVM id」フィールドにサーバーの名前を指定する必要があります。たとえば、exampleServerでJCOMネイティブ・モードが有効になっているときに、regjvmを使用して登録する場合には、「JV id」ボックスにexampleServerと入力します。

Visual Basicクライアントから呼び出すクラスがディレクトリc:\pure内にあり、使用しているJDKがc:\jdk1.7.0_15内にあり、WebLogic Serverがc:\Oracle\Middlewareにインストールされていることを想定します。次のように、regjvmツール画面に値を入力します。

JVM名、CLASSPATH、およびJVM binディレクトリ・パスを指定します。

これで、Visual BasicからGetObjectメソッドを呼び出すことができるようになります。

MessageBox GetObject("MyJVM.jndi.ejb20.beanManaged.AccountHome")

regjvmツールの詳細は、「jCOMツールの詳細」を参照してください。