ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server JCOMのプログラミング
11g リリース1 (10.3.6)
B61628-05
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

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

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

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

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に追加します。例:

    set CLASSPATH=%JAVA_HOME%\lib\tools.jar;
    %WL_HOME%\server\lib\weblogic.jar;%CLASSPATH%
    

    JAVA_HOMEは、JDKがインストールされているルート・フォルダ(デフォルトはc:\Oracle\Middleware\jdk160またはc:\Oracle\Middleware\jrockit_160)で、WL_HOMEは、WebLogic Platformソフトウェアがインストールされているルート・ディレクトリ(デフォルトはc:\Oracle\Middleware\wlserver_10.3)です。

  2. java2comツールでjavaラッパー・ファイルとIDLファイルを生成します。

    java com.bea.java2com.Main
    

    java2com GUIが表示されます。

    java2comdefault.gifについては周囲のテキストで説明しています。
  3. 次のように入力します。

    Java Classes & Interfaces: 変換するラッパー・クラスのリスト

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

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

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

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

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

    この時点で「生成」ボタンをクリックしてラッパーとIDLを作成すると、エラーが生成されます。これは、java2comツールのデフォルトで特定のクラスが省略されているためです。コンパイル中に生成されたエラーを参照することで、どのクラスで問題が発生しているか判別できます。

    この問題を修正するには、java2comツールで「名前」ボタンをクリックして、必要なクラス・ファイルへのあらゆる参照を削除します。この例では、次の参照を削除する必要があります。

    *.toString > '''' 
    class java.lang.Class > ''''
    
    com_names.gifについては周囲のテキストで説明しています。
  4. これらの参照が削除されると、ラッパーとIDLを生成できます。java2com GUIで「生成」をクリックします。

    java2comツールでは、Javaオブジェクトへのアクセスに使用されるDCOMマーシャリング・コードを含むJavaクラスが生成されます。これらの生成されたクラスは、WebLogic jCOMランタイムによって背後で使用されます。必要なのはこれらのクラスをコンパイルすることだけです。また、これらのクラスがCLASSPATHに含まれていることを確認してください。

アクセス制御の構成

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. 「セキュリティ・ポリシーの定義」をクリックします。

  4. 「ポリシー条件」ボックスで、「呼出し側はグループのメンバーです」をダブルクリックします。

  5. 「グループ名を入力」フィールドに、アクセスを許可するユーザー・グループの名前を入力します。

  6. 「追加」をクリックします。

  7. 「OK」をクリックします。

  8. ウィンドウの右下にある「適用」をクリックします。

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ツールの詳細は、第5章「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ツールを呼び出すと、次の画面が表示されます。

    regjvm_dcom.gifについては周囲のテキストで説明しています。
  2. WebLogic Serverがローカル・ホスト以外で実行しており、7001以外のポートをリスニングしている場合、ホスト名(またはIPアドレス)およびポート番号を入力します。

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

    regjvmcmd servername localhost[7001]

JVMの登録解除

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

regjvm_dcom.gifについては周囲のテキストで説明しています。

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") 

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

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

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アプリケーションでは、ネイティブ・モードに「イン・プロセス」と「アウト・オブ・プロセス」の区別があります。

アプリケーションで使用するプロセスを指定するには、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ツールの詳細は、第5章「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を使用してJavaオブジェクトにレイト・バインド・アクセスすることです。まず、JVMを登録します。SunのJDK 1.3.1 (デフォルトでc:\Oracle\Middleware\jdk160にインストールされています)を使用し、WebLogic Serverがc:\Oracle\Middleware\wlserver_10.3\server\lib\weblogic.jarにインストールされており、Javaクラスがc:\pureに格納されている場合は、以下のregjvmツール画面のように設定します。

regjvm7.gifについては周囲のテキストで説明しています。

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

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

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

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