Oracle® Fusion Middleware Oracle WebLogic Server JCOM プログラマーズ ガイド 11g リリース 1 (10.3.1) B55534-01 |
|
![]() 戻る |
![]() 次へ |
この章では、COM クライアントから WebLogic Server オブジェクト上のメソッドを呼び出すために WebLogic jCOM を使用する方法について説明します。
COM-to-WLS アプリケーションをネイティブ モードで実行するためには、WebLogic Server を COM クライアント マシンにインストールする必要があります。
ネイティブ モードの詳細については、「ネイティブ モードでの COM-to-WLS アプリケーションの実行」を参照してください。
この節では、COM クライアントから WebLogic Server への呼び出しを行うための主な手順を簡単に説明します。詳細については、以降の節で説明します。
WebLogic Server 側
アーリー バインディングを使用している場合、java2com
ツールを実行して Java ラッパー クラスとインタフェース定義言語 (Interface Definition Language : IDL) ファイルを生成し、これらのファイルをコンパイルします。「Java ラッパーおよび IDL ファイルの生成 - アーリー バインディングのみ」を参照してください。
サーバ リスン ポート上で COM 呼び出しを有効化します。『Oracle Fusion Middleware Oracle WebLogic Server Administration Console ヘルプ』の「jCOM の有効化」を参照してください。
COM クライアントにサーバ クラスへのアクセスを許可します。「アクセス制御のコンフィグレーション」を参照してください。
他の関連するコンソール プロパティをコンフィグレーションします。『Oracle Fusion Middleware Oracle WebLogic Server Administration Console ヘルプ』の「サーバ : プロトコル : jCOM」を参照してください。
COM クライアント側
jCOM ツール ファイルおよび WebLogic Server クラス ファイル (ネイティブ モードの場合のみ) をインストールします。「必要なファイルのインストール」を参照してください。
ゼロ クライアント インストールの場合
オブジェクト参照モニカ (object reference moniker: ORM) を WebLogic Server ORM サーブレットからプログラムとして取得するか、アプリケーションに貼りつけることで取得します。「WebLogic Server サーブレットからのオブジェクト参照モニカの取得 - ゼロ クライアントのみ」を参照してください。
アーリー バインディングを使用している場合
WebLogic Server マシン上で生成された IDL ファイルを取得して、型ライブラリにコンパイルします。
型ライブラリと、サービスする WebLogic Server を登録します。
上記の手順については、「Java ラッパーおよび IDL ファイルの生成 - アーリー バインディングのみ」を参照してください。
レジストリに WebLogic Server JVM を登録します。ネイティブ モードで WebLogic Server と通信する場合、ここで設定します。「クライアント マシン レジストリへの WebLogic Server JVM の登録」を参照してください。
COM クライアント アプリケーションをコード化します。「COM クライアント アプリケーションのコード化」を参照してください。
COM クライアントを起動します。「COM クライアントの起動」を参照してください。
以下の節では、COM クライアントが WebLogic Server オブジェクト上のメソッドを呼び出せるように、WebLogic Server を準備する方法について説明します。
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
) です。
java2com
ツールで java ラッパー ファイルと IDL ファイルを生成します。
java com.bea.java2com.Main
java2com
GUI が表示されます。
次のように入力します。
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 > ''''
これらの参照が削除されると、ラッパーと IDL を生成できます。java2com
GUI で [Generate] をクリックします。
java2com
ツールでは、Java オブジェクトへのアクセスに使用される DCOM マーシャリング コードを含む Java クラスが生成されます。これらの生成されたクラスは、WebLogic jCOM ランタイムによって背後で使用されます。必要なのはこれらのクラスをコンパイルすることだけです。また、これらのクラスが CLASSPATH に含まれていることを確認してください。
COM クライアント アプリケーションがアクセスする必要のあるクラスに、COM クライアント ユーザ アクセスを許可します。特定のアプリケーションによって、どのクラスを公開するかが決定されます。
たとえば、COM クライアントが次の 3 つのクラスにアクセスする必要があるとします。
java.util.Collection
java.util.Iterator
ejb20.basic.beanManaged
WebLogic Server Administration Console の左ペインで [サービス] ノードをクリックしてから、その下の [jCOM] ノードをクリックします。
右ペインで、次のように入力します。
java.util.*
[セキュリティ ポリシーを定義] をクリックします。
[ポリシー条件] ボックスで、[呼び出し側をメンバーとするグループは] をダブルクリックします。
[グループ名の入力] フィールドに、アクセスを許可するユーザ グループの名前を入力します。
[追加] をクリックします。
[OK] をクリックします。
ウィンドウの右下にある [適用] をクリックします。
ejb20.basic.beanManaged
へのアクセスを許可するには、手順 3 の「java.util.*」を「ejb20.basic.beanmanaged.*」に置き換えて、「java.util.Collection および java.util.Iterator へのアクセスの許可」の手順を繰り返します。
最後にアスタリスクが付いているため、実際には ejb20.basic.beanManaged
パッケージ全体に対してアクセスを許可しています。
以下の節では、WebLogic Server オブジェクト上のメソッドを呼び出せるように COM クライアントを準備する方法について説明します。
WebLogic Server オブジェクト上のメソッドを呼び出すために、クライアント マシンにインストールしておく必要のあるファイルが多数あります。以下に示すように、このうち一部のファイルは、ネイティブ モードでメソッドを呼び出す場合にのみ必要です。
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 ツールの詳細」を参照してください。
オブジェクト参照モニカ (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 モニカを使用できます。
クライアントサイドに割り当てられたラッパー ファイルおよびインタフェース定義言語 (Interface Definition Language: IDL) ファイルの生成を実行します。
IDL をクライアント マシンにコピーします。
WebLogic Server 上で java2com
ツールの実行 (「WebLogic Server の準備」を参照) に成功した場合、IDL ファイルがサーバ マシン上に作成されています。この IDL ファイルをクライアント マシンにコピーして、この COM アプリケーションの \TLB
サブディレクトリに配置します。
注意 : java2com ツールがサンプルの \TLB サブディレクトリに出力しているはずなので、同じマシン上でクライアントとサーバを実行している場合、この手順は必要ありません。 |
IDL ファイルをコンパイルして、型ライブラリを作成します。
midl containerManagedTLB.idl
このコマンドで Microsoft IDL コンパイラ MIDL.EXE
を呼び出して、コンパイルを実行します。コンパイルの結果、containerManagedTLB.tlb
という型ライブラリが作成されます。
型ライブラリを登録し、サービスする 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 に含めることはできません。
サーバ名を Windows レジストリに追加し、その名前を TCP/IP アドレスおよび WebLogic が受信する COM 要求をリスンするクライアント サーバ間の通信ポートに関連付けることで、ローカル Java 仮想マシンに登録します。デフォルトは、localhost:7001 です。
regjvm
GUI ツールを呼び出すと、次の画面が表示されます。
WebLogic Server がローカルホスト以外で実行しており、7001 以外のポートをリスンしている場合、ホスト名 (または IP アドレス) およびポート番号を入力します。
regjvm
のコマンドライン バージョンを使用することもできます。
regjvmcmd
servername
localhost[7001]
regjvm
(または regjvmcmd
) ツールでは、古いエントリと同名の新しいエントリが入力されても、古いエントリは上書きされません。このため、通信するマシンのホスト名またはポートを変更する必要がある場合は、古いエントリの登録を解除して新しいエントリを作成する必要があります。
Regjvm
ツール ウィンドウで JVM を登録解除するには、登録を解除する JVM を選択して、[Delete] を選択します。
別の方法として、コマンドライン ツール regjvmcmd
から JVM の登録を解除します。
regjvmcmd /unregister servername
COM クライアントをネイティブ モードで実行している場合、[regjvm
] ウィンドウで [native mode] または [Native Mode Out-of-Process] ラジオ ボタンをクリックするか、または /native
パラメータを使用して regjvmcmd
を呼び出します。この手順に関する詳細については、「ネイティブ モードでの COM-to-WLS アプリケーションの実行」を参照してください。
これで、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-to-WLS アプリケーションでは、ネイティブ モードに「イン プロセス」と「アウト オブ プロセス」の区別があります。
アウト オブ プロセス - JVM は独自のプロセス内で作成され、COM プロセスと WebLogic Server JVM プロセスの間でプロセス間通信が発生します。
イン プロセス - WebLogic Server JVM 全体が COM プロセスに取り込まれます。つまり、COM クライアントのアドレス空間にロードされます。WebLogic Server クライアントサイド クラスはこの JVM 内に配置されています。
アプリケーションで使用するプロセスを指定するには、regjvm
GUI ツール インタフェースで [Native mode in process] または [Native mode] ラジオ ボタンを選択します。
JVM をアウト オブ プロセスで実行する (ただし、ネイティブ コードを使用して COM クライアントに中の Java オブジェクトへのアクセスを許可する) 場合、次の手順に従います。
regjvm
GUI ツールを呼び出して、JVM をネイティブとして登録します。regjvm
では、さまざまなレジストリ エントリが設定され、WebLogic jCOM の COM と WLS 間のメカニズムが容易になります。
注意 : JVM を登録する場合には、[JVM id] フィールドにサーバの名前を指定する必要があります。たとえば、exampleServer で JCOM ネイティブ モードが有効になっているときに、regjvm を使用して登録する場合には、[JVM id] ボックスに exampleServer と入力します。 |
JVM が実行されていない場合は、[Advanced] ラジオ ボタンをクリックして、[Launch Command] フィールドに JVM のパスを入力します。
regjvm
ツールの詳細については、「5 jCOM ツールの詳細」を参照してください。
アプリケーション コードの 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 時間の休止 }
これで、Visual Basic からレイト バインディングを使用して、JVM にロードできる Java クラスのインスタンスをインスタンス化できます。
Set acctEJB = CreateObject("firstjvm.jndi.ejb20.beanManaged.AccountHome")
JVM を登録したら、標準 WebLogic jCOM regtlb
コマンドを使用して Java オブジェクトにアーリー バインド アクセスします (regtlb
はパラメータとして型ライブラリの名前と JVM 名を取り、その型ライブラリに定義されているすべての COM オブジェクトをその JVM に存在するものとして登録します)。
また、独自のインスタンシエータ (com.bea.jcom.Jvm.register(...)
への追加パラメータ) を JVM に関連付けることによって、COM クライアントの代わりに Java オブジェクトのインスタンス化を制御できます。これは、オブジェクト ファクトリの一種です。
このテクニックを使用すると、実際に 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
ツール画面のように設定します。
JVM 名、CLASSPATH、および JVM bin ディレクトリ パスを指定します。
これで、Visual Basic から GetObject メソッドを呼び出すことができるようになります。
MessageBox GetObject("MyJVM.jndi.ejb20.beanManaged.AccountHome")
regjvm
ツールの詳細については、「5 jCOM ツールの詳細」を参照してください。