シン・クライアントはJavaアプリケーションですが、Java EEコンポーネントであるため、スタンドアロンのJavaアプリケーション・クライアントとは異なります。したがって、他のJava EE準拠のサーバーへ移植できるという利点があり、Java EEサービスにアクセスできます。
以下のアプリケーション・クライアントJARファイルが用意されています。
Java EE機能を提供する標準クライアントJAR (wlclient.jar
)。「シン・クライアントの開発方法」を参照してください
JMSクライアントJAR (wljmsclient.jar
)は、wlclient.jar
と共にデプロイするとき、Java EE機能とWebLogic JMS機能を提供します。「WebLogic JMSシン・クライアント」を参照してください。
JMS SAFクライアントJAR (wlsafclient.jar
)は、wljmsclient.jar
およびwlclient.jar
とともにデプロイするとき、一時的に宛先にアクセスできない場合でも、スタンドアロンのJMSクライアントはサーバー側のJMS宛先にメッセージを確実に送信できるようになります。送信メッセージは、クライアント上でローカルに格納され、宛先が使用可能になったときに転送されます。「JMS SAFクライアントによる確実なメッセージ送信」を参照してください。
これらのアプリケーション・クライアントJARファイルは、WebLogic Serverのインストール・ディレクトリのWL_HOME
/server/lib
サブディレクトリに格納されています。
シン・クライアントでは、RMI-IIOPプロトコル・スタックを使用し、Java SEの機能を活用します。また、JDK ORBのサポートも必要とします。RMIリクエストの作成は基本的にJDKで処理されるため、非常に小さいクライアントを実現できます。クライアント側の開発は、WebLogic Server APIではなく標準のJava EE APIを使用して実行されます。
シン・クライアント・アプリケーションの開発プロセスは、他のJava EEアプリケーションにおけるプロセスと同じです。クライアントではInitialContext
、UserTransaction
、EJBなどの標準Java EEアーティファクトを活用できます。WebLogic Serverシン・クライアントでは、URLのプロトコル部分の値としてIIOP、IIOPS、HTTP、HTTPS、T3、およびT3Sがサポートされています。それぞれ、InitialContext
で異なるURLを使用することで選択できます。URLに関係なく、IIOPが使用されます。URLにT3を指定するとIIOPが使用され、T3Sを指定するとIIOPSが使用されます。HTTPはトンネリングされたIIOPであり、HTTPSはHTTPS上でトンネリングされたIIOPです。
サーバー側コンポーネントは、通常の方法でデプロイされます。クライアント・スタブは、デプロイメント時または実行時に生成できます。デプロイ時にスタブを生成するには、-iiop
および-basicClientJar
オプションを付けてappcを実行し、シン・クライアントでの使用に適したクライアントjarを作成します。この手順を実行しない場合、WebLogic Serverで必要に応じて実行時にスタブが生成され、クライアントに提供されます。クライアントでスタブをダウンロードするには、適切なセキュリティ・マネージャがインストールされている必要があります。シン・クライアントでは、デフォルトで軽量のセキュリティ・マネージャが提供されます。強固なセキュリティが必要な場合は、コマンド・ライン・オプションの-Djava.security.manager
、-Djava.security.policy==policyfile
を使用して、別のセキュリティ・マネージャをインストールできます。アプレットでは、スタブのダウンロードを可能にする別のセキュリティ・マネージャが使用されます。
シン・クライアントをデプロイする際には、クライアントのファイル・システムにwlclient.jar
ファイルがインストールされていること、クライアントのCLASSPATH
にwlclient.jar
ファイルへの参照が指定されていることが必要です。
シン・クライアントを開発するには:
リモート・オブジェクトのパブリック・メソッドを、java.rmi.Remote
を拡張するインタフェースに定義します。
このリモート・インタフェースには、コードをあまり記述する必要がない場合もあります。必要なのは、リモート・クラスで実装するメソッドのメソッド・シグネチャだけです。例:
public interface Pinger extends java.rmi.Remote { public void ping() throws java.rmi.RemoteException; public void pingRemote() throws java.rmi.RemoteException;
interfaceNameImpl
というクラスにインタフェースを実装し、それをJNDIツリー内にバインドしてクライアントから利用できるようにします。
このクラスには、記述済みのリモート・インタフェースを実装する必要があります。これにより、インタフェースに含まれるメソッド・シグネチャを実装したことになります。すべてのコード生成はこのクラス・ファイルに依存します。通常は、実装クラスをWebLogic起動クラスとして構成し、そのオブジェクトをJNDIツリー内にバインドするmainメソッドをインクルードします。以下に、上記のPingのサンプルを基に開発した実装クラスからの抜粋を示します。
public static void main(String args[]) throws Exception { if (args.length > 0) remoteDomain = args[0]; Pinger obj = new PingImpl(); Context initialNamingContext = new InitialContext(); initialNamingContext.rebind(NAME,obj); System.out.println("PingImpl created and bound to "+ NAME); }
リモート・インタフェースと実装クラスをJavaコンパイラでコンパイルします。RMI-IIOPアプリケーションにおけるこれらのクラスの開発は、通常のRMIでの開発と同じです。RMIオブジェクト開発の詳細は、『Oracle WebLogic Server RMIアプリケーションの開発』を参照してください
実装クラスに対してWebLogic RMIまたはEJBコンパイラを実行して、必要なIIOPスタブを生成します。スタブをダウンロードする場合は、rmic
を実行する必要はありません。
$ java weblogic.rmic -iiop nameOfImplementationClass
デプロイ時にスタブを生成するには、-iiop
および-clientJar
オプションを付けてappcを実行し、シン・クライアントでの使用に適したクライアントJARを作成します。この手順を実行しない場合、WebLogic Serverで必要に応じて実行時にスタブが生成され、クライアントに提供されます。
スタブはリモート・オブジェクト用のクライアント側プロキシで、個々のWebLogic RMI呼出しを対応するサーバー側スケルトンに転送します。続いてサーバー側スケルトンが、その呼出しを実際のリモート・オブジェクト実装に転送します。
ここまでで作成したファイル、すなわち、リモート・インタフェース、それを実装するクラス、およびスタブがWebLogic ServerのCLASSPATH
に含まれていることを確かめます。
初期コンテキストを取得します。
RMIクライアントでは、初期コンテキストを作成しリモート・オブジェクトをルックアップして(次のステップを参照)、そのオブジェクトにアクセスします。続いて、このオブジェクトが適切な型にキャストされます。
初期コンテキストの取得では、JNDIコンテキスト・ファクトリを定義する際にweblogic.jndi.WLInitialContextFactory
を使用する必要があります。新しいInitialContext()
にパラメータとして渡すContext.INITIAL_CONTEXT_FACTORY
プロパティの値を設定する際には、このクラスを使用します。
javax.rmi.PortableRemoteObject.narrow()
メソッドと組み合せてルックアップを実行するように、クライアントのコードを修正します。
RMI over IIOP RMIクライアントが通常のRMIクライアントと異なるのは、初期コンテキストを取得する際にプロトコルとしてIIOPが定義されるという点です。このため、ルックアップとキャストは、javax.rmi.PortableRemoteObject.narrow()
メソッドと組み合せて行われます。たとえばRMIクライアントは、初期コンテキストを作成し、EJBeanホームをルックアップしてEJBeanへの参照を取得し、EJBean上でメソッドを呼び出します。
通常ならオブジェクトを特定のクラス型へキャストするような状況ではすべて、javax.rmi.PortableRemoteObject.narrow()
メソッドを使用する必要があります。CORBAクライアントからは、リモート・インタフェースを実装しないオブジェクトが返されることがあります。そのため、リモート・インタフェースを実装するようオブジェクトを変換するためにORBからnarrowメソッドが提供されます。たとえば、EJBeanホームをルックアップして、その結果をHomeオブジェクトにキャストするクライアント・コードは、以下に示すように、javax.rmi.PortableRemoteObject.narrow()
を使用するように修正する必要があります。
次のようなコマンドでクライアントを実行することで、IIOPを通じてクライアントをサーバーに接続します。
$ java -Djava.security.manager -Djava.security.policy=java.policy examples.iiop.ejb.stateless.rmiclient.Client iiop://localhost:7001
例5-1 ルックアップの実行:
. . . /** * RMI/IIOP clients should use this narrow function */ private Object narrow(Object ref, Class c) { return PortableRemoteObject.narrow(ref, c); } /** * Lookup the EJBs home in the JNDI tree */ private TraderHome lookupHome() throws NamingException { // Lookup the beans home using JNDI Context ctx = getInitialContext(); try { Object home = ctx.lookup(JNDI_NAME); return (TraderHome) narrow(home, TraderHome.class); } catch (NamingException ne) { log("The client was unable to lookup the EJBHome. Please make sure "); log("that you have deployed the ejb with the JNDI name "+JNDI_NAME+" on the WebLogic server at "+url); throw ne; } } /** * Using a Properties object will work on JDK130 * and higher clients */ private Context getInitialContext() throws NamingException { try { // Get an InitialContext Properties h = new Properties(); h.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"); h.put(Context.PROVIDER_URL, url); return new InitialContext(h); } catch (NamingException ne) { log("We were unable to get a connection to the WebLogic server at "+url); log("Please make sure that the server is running."); throw ne; } } . . .
url
では、プロトコル、ホスト名、WebLogic Serverインスタンス用のリスニング・ポートを定義し、それらがコマンド・ライン引数として渡されます。
public static void main(String[] args) throws Exception { log("\nBeginning statelessSession.Client...\n"); String url = "iiop://localhost:7001";
次のようなコマンドでクライアントを実行することで、IIOPを通じてクライアントをサーバーに接続します。
$ java -Djava.security.manager -Djava.security.policy=java.policy examples.iiop.ejb.stateless.rmiclient.Client iiop://localhost:7001