Oracle® Fusion Middleware Oracle WebLogic Server JCOMのプログラミング 11gリリース1 (10.3.6) B61628-06 |
|
前 |
次 |
この章では、COMクライアントからWebLogic Serverオブジェクト上のメソッドを呼び出すためにWebLogic jCOMを使用する方法について説明します。
COM-to-WLSアプリケーションをネイティブ・モードで実行するためには、WebLogic ServerをCOMクライアント・マシンにインストールする必要があります。
ネイティブ・モードの詳細は、「ネイティブ・モードでのCOM-to-WLSアプリケーションの実行」を参照してください。
この節では、COMクライアントからWebLogic Serverへの呼出しを行うための主な手順を簡単に説明します。詳細については、以降の節で説明します。
WebLogic Server側
アーリー・バインディングを使用している場合、java2com
ツールを実行してJavaラッパー・クラスとインタフェース定義言語(IDL)ファイルを生成し、これらのファイルをコンパイルします。「JavaラッパーおよびIDLファイルの生成 - アーリー・バインディングのみ」を参照してください。
サーバー・リスニング・ポート上でCOM呼出しを有効化します。Oracle WebLogic Server管理コンソール・ヘルプのjCOMの有効化に関する項を参照してください。
COMクライアントにサーバー・クラスへのアクセスを許可します。「アクセス制御の構成」を参照してください。
他の関連するコンソール・プロパティを構成します。Oracle WebLogic Server管理コンソール・ヘルプのサーバー: プロトコル: 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インタフェースとしてアクセス可能になります。
この時点で「生成」ボタンをクリックしてラッパーとIDLを作成すると、エラーが生成されます。これは、java2com
ツールのデフォルトで特定のクラスが省略されているためです。コンパイル中に生成されたエラーを参照することで、どのクラスで問題が発生しているか判別できます。
この問題を修正するには、java2com
ツールで「名前」ボタンをクリックして、必要なクラス・ファイルへのあらゆる参照を削除します。この例では、次の参照を削除する必要があります。
*.toString > '''' class java.lang.Class > ''''
これらの参照が削除されると、ラッパーとIDLを生成できます。java2com
GUIで「生成」をクリックします。
java2com
ツールでは、Javaオブジェクトへのアクセスに使用されるDCOMマーシャリング・コードを含むJavaクラスが生成されます。これらの生成されたクラスは、WebLogic jCOMランタイムによって背後で使用されます。必要なのはこれらのクラスをコンパイルすることだけです。また、これらのクラスがCLASSPATHに含まれていることを確認してください。
COMクライアント・アプリケーションがアクセスする必要のあるクラスへのアクセス権をCOMクライアント・ユーザーに付与します。特定のアプリケーションによって、どのクラスを公開するかが決まります。
たとえば、COMクライアントが次の3つのクラスにアクセスする必要があるとします。
java.util.Collection
java.util.Iterator
ejb20.basic.beanManaged
WebLogic Server管理コンソールの左ペインで「サービス」ノードをクリックしてから、その下の「jCOM」ノードをクリックします。
右ペインで、次のように入力します。
java.util.*
「セキュリティ・ポリシーの定義」をクリックします。
「ポリシー条件」ボックスで、「呼出し側はグループのメンバーです」をダブルクリックします。
「グループ名を入力」フィールドに、アクセスを許可するユーザー・グループの名前を入力します。
「追加」をクリックします。
「OK」をクリックします。
ウィンドウの右下にある「適用」をクリックします。
ejb20.basic.beanManaged
へのアクセスを許可するには、ステップ3のjava.util.*をejb20.basic.beanmanagedに置き換えて、「java.util.Collectionおよびjava.util.Iteratorへのアクセスの許可」の手順を繰り返します。
以下の節では、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ツールの詳細」を参照してください。
オブジェクト参照モニカー(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インスタンスにアクセスできます。
クライアント側に割り当てられたラッパー・ファイルおよびインタフェース定義言語(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に含める必要があります。単にEJB jarに含めることはできません。
サーバー名をWindowsレジストリに追加し、その名前をTCP/IPアドレスおよびWebLogicが受信するCOMリクエストをリスニングするクライアント・サーバー間の通信ポートに関連付けることで、ローカルJava仮想マシンに登録します。デフォルトは、localhost:7001です。
regjvm
GUIツールを呼び出すと、次の画面が表示されます。
WebLogic Serverがローカル・ホスト以外で実行しており、7001以外のポートをリスニングしている場合、ホスト名(またはIPアドレス)およびポート番号を入力します。
regjvm
のコマンド・ライン・バージョンを使用することもできます。
regjvmcmd
servername
localhost[7001]
regjvm
(またはregjvmcmd
)ツールでは、古いエントリと同名の新しいエントリが入力されても、古いエントリは上書きされません。したがって、通信するマシンのホスト名またはポートを変更する必要がある場合は、古いエントリの登録を解除して新しいエントリを作成します。
Regjvm
ツール・ウィンドウでJVMを登録解除するには、登録を解除するJVMを選択して、「削除」を選択します。
別の方法として、コマンド・ライン・ツールregjvmcmd
からJVMの登録を解除します。
regjvmcmd /unregister servername
COMクライアントをネイティブ・モードで実行している場合、「regjvm
」ウィンドウで「ネイティブ・モード」または「ネイティブ・モード(アウト・オブ・プロセス)」ラジオ・ボタンをクリックするか、または/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 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-to-WLSアプリケーションでは、ネイティブ・モードに「イン・プロセス」と「アウト・オブ・プロセス」の区別があります。
アウト・オブ・プロセス - JVMは独自のプロセス内で作成され、COMプロセスとWebLogic Server JVMプロセスの間でプロセス間通信が発生します。
イン・プロセス - WebLogic Server JVM全体がCOMプロセスに取り込まれます。つまり、COMクライアントのアドレス空間にロードされます。WebLogic Serverクライアント側クラスはこのJVM内に配置されています。
アプリケーションで使用するプロセスを指定するには、regjvm
GUIツール・インタフェースで「ネイティブ・モード(イン・プロセス)」または「ネイティブ・モード」ラジオ・ボタンを選択します。
JVMをアウト・オブ・プロセスで実行する(ただし、ネイティブ・コードを使用してCOMクライアントに中のJavaオブジェクトへのアクセスを許可する)場合、次の手順に従います。
regjvm
GUIツールを呼び出して、JVMをネイティブとして登録します。regjvm
では、WebLogic jCOMのCOM-to-WLSメカニズムの動作を円滑化にするために、様々なレジストリ・エントリが登録されます。JVMを登録する場合には、「JVM id」フィールドにサーバーの名前を指定する必要があります。たとえば、exampleServer
でJCOMネイティブ・モードが有効になっている場合は、regjvm
を使用して登録する際に、「JVM id」ボックスにexampleServer
と入力します。
JVMが実行されていない場合は、「詳細」ラジオ・ボタンをクリックして、「起動コマンド」フィールドに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 { // Register the JVM with the name "firstjvm" com.bea.jcom.Jvm.register("firstjvm"); Thread.sleep(6000000); // Sleep for an hour }
これで、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ツールの詳細」を参照してください。