ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server JCOM プログラマーズ ガイド
11g リリース 1 (10.3.1)
B55534-01
 

目次
目次

戻る
戻る
 
次へ
次へ
 

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 ラッパー クラスとインタフェース定義言語 (Interface Definition Language : IDL) ファイルを生成し、これらのファイルをコンパイルします。「Java ラッパーおよび IDL ファイルの生成 - アーリー バインディングのみ」を参照してください。

  2. サーバ リスン ポート上で COM 呼び出しを有効化します。『Oracle Fusion Middleware Oracle WebLogic Server Administration Console ヘルプ』の「jCOM の有効化」を参照してください。

  3. COM クライアントにサーバ クラスへのアクセスを許可します。「アクセス制御のコンフィグレーション」を参照してください。

  4. 他の関連するコンソール プロパティをコンフィグレーションします。『Oracle Fusion Middleware Oracle WebLogic Server Administration Console ヘルプ』の「サーバ : プロトコル : 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 インタフェースとしてアクセス可能になります。

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

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

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

    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 Administration Console の左ペインで [サービス] ノードをクリックしてから、その下の [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 へのアクセスの許可」の手順を繰り返します。

最後にアスタリスクが付いているため、実際には ejb20.basic.beanManaged パッケージ全体に対してアクセスを許可しています。

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 サーブレットからのオブジェクト参照モニカの取得 - ゼロ クライアントのみ

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

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

  • WebLogic Server 上で実行しているサーブレットを通じて、ORM を取得します。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 モニカを示し、その使い方を説明する長いメッセージが表示されます。また、表示されるテキストは自動的にクリップボードにコピーされるので、ソースに直接貼り付けできます。指定したマシンとポートで WebLogic Server にアクセスするために、返された objref モニカを使用できます。

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 に含める必要があります。単に EJBjar に含めることはできません。

クライアント マシン レジストリへの 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 を選択して、[Delete] を選択します。

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

regjvmcmd /unregister servername

ネイティブ モードを選択している場合

COM クライアントをネイティブ モードで実行している場合、[regjvm] ウィンドウで [native mode] または [Native Mode Out-of-Process] ラジオ ボタンをクリックするか、または /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 via 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 ツール インタフェースで [Native mode in process] または [Native mode] ラジオ ボタンを選択します。

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

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

  1. regjvm GUI ツールを呼び出して、JVM をネイティブとして登録します。regjvm では、さまざまなレジストリ エントリが設定され、WebLogic jCOM の COM と WLS 間のメカニズムが容易になります。


    注意 :

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

周囲のテキストは regjvm4.gif を説明します。
  1. JVM が実行されていない場合は、[Advanced] ラジオ ボタンをクリックして、[Launch Command] フィールドに JVM のパスを入力します。

周囲のテキストは regjvm5.gif を説明します。

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

  1. アプリケーション コードの main セクションに次のコードを挿入して、WebLogic jCOM ランタイムに JVM が呼び出しを受け取る準備ができていることを知らせます。

    com.bea.jcom.Jvm.register("MyJvm"):
    public class MyJvm {
    public static void main(String[] args) throws Exception {
    // "firstjvm" の名前で JVM を登録
    com.bea.jcom.Jvm.register("firstjvm");
    Thread.sleep(6000000); // 1 時間の休止
    }
    
  2. これで、Visual Basic からレイト バインディングを使用して、JVM にロードできる Java クラスのインスタンスをインスタンス化できます。

    Set acctEJB = CreateObject("firstjvm.jndi.ejb20.beanManaged.AccountHome")
    
  3. 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 ツールの詳細」を参照してください。