Oracle® Fusion Middleware Oracle WebLogic Serverスタンドアロン・クライアントのプログラミング 12c リリース1 (12.1.1) B65897-02 |
|
前 |
次 |
この章では、Java SEクライアントの開発方法と使用方法について説明します。Java SEクライアントはJava EEプログラミング・モデルを指向しており、WebLogic ServerクラスなしでRMIの機能とIIOPプロトコルが一体化されています。
Java SEクライアントは、Java EEまたはJava SEコンテナ(ほとんどの場合、JDK 1.3以降)をホストとするRMI-IIOP対応ORBを実行します。Java SEクライアントには次の特性があります。
業界標準であるIIOPを使用する軽量な接続クライアントを提供します。
Java EE準拠モデルではなくJava SE準拠モデル。このため、エンタープライズ・レベルのアプリケーションで提供される多数の機能はサポートしていません。また、セキュリティ、トランザクション、JMSもサポートしていません。
クライアントのEJB 2.1リモート・クライアント・ビューを通じて、EJB 3.0仕様に基づくEJBの分散相互運用がWebLogic Serverによってサポートされます。
RMIクライアント使用型RMI-IIOPを用いてアプリケーションを開発するには:
リモート・オブジェクトのパブリック・メソッドを、java.rmi.Remote
を拡張するインタフェースに定義します。
このリモート・インタフェースには、コードをあまり記述する必要がない場合もあります。必要なのは、リモート・クラスで実装するメソッドのメソッド・シグネチャだけです。例:
public interface Pinger extends java.rmi.Remote { public void ping() throws java.rmi.RemoteException; public void pingRemote() throws java.rmi.RemoteException; public void pingCallback(Pinger toPing) throws java.rmi.RemoteException; }
interfaceNameImplというクラスにインタフェースを実装し、それをJNDIツリー内にバインドしてクライアントから利用できるようにします。
このクラスには、記述済みのリモート・インタフェースを実装する必要があります。これにより、インタフェースに含まれるメソッド・シグネチャを実装したことになります。すべてのコード生成はこのクラス・ファイルに依存します。通常は、実装クラスをWebLogic起動クラスとして構成し、そのオブジェクトをJNDIツリー内にバインドするmainメソッドをインクルードします。例:
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スタブを生成します。以下に示すように、IIOPスタブの生成に-iiop
オプションを使用する必要はありません。
$ java weblogic.rmic nameOfImplementationClass
スタブはリモート・オブジェクト用のクライアント側プロキシで、個々のWebLogic RMI呼出しを対応するサーバー側スケルトンに転送します。続いてサーバー側スケルトンが、その呼出しを実際のリモート・オブジェクト実装に転送します。なお、WebLogic RMIコンパイラで作成されるIIOPスタブは、JDK 1.3.1_01以降のORBで使用するためのものです。他のORBを使用する場合、それぞれのORBベンダーのドキュメントを参照して、これらのスタブが適切かどうかを判断してください。
ここまでで作成したファイル、すなわち、リモート・インタフェース、それを実装するクラス、およびスタブをWebLogic ServerのCLASSPATHに指定します。
初期コンテキストを取得します。
RMIクライアントでは、初期コンテキストを作成しリモート・オブジェクトをルックアップして(次のステップを参照)、そのオブジェクトにアクセスします。続いて、このオブジェクトが適切な型にキャストされます。
初期コンテキストの取得では、JNDIコンテキスト・ファクトリを定義する際にcom.sun.jndi.cosnaming.CNCtxFactory
を使用する必要があります。新しいInitialContext()
にパラメータとして渡すContext.INITIAL_CONTEXT_FACTORY
プロパティの値を設定する際には、com.sun.jndi.cosnaming.CNCtxFactory
を使用します。
注意: Sun JNDIクライアントでは、ネームスペースからリモート・オブジェクト参照を読み込む機能はサポートされていますが、シリアライズされた汎用Javaオブジェクトの読込みはサポートされていません。つまり、ネームスペースからEJBHomeなどを読み込むことはできますが、DataSourceオブジェクトを読み込むことはできません。この構成では、クライアントで開始されたトランザクション(JTA API)もサポートされません。また、セキュリティもサポートされていません。次のステートレス・セッションBeanのRMIクライアントのサンプルでは、以下のコードで初期コンテキストを取得します。 |
例8-1 InitialContextの取得
. . . * Using a Properties object as follows will work on JDK13 * and higher clients. */ private Context getInitialContext() throws NamingException { try { // Get an InitialContext Properties h = new Properties(); h.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.cosnaming.CNCtxFactory"); 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; } /** * This is another option, using the Java2 version to get an * InitialContext. * This version relies on the existence of a jndi.properties file in * the application's classpath. See * "Programming JNDI for Oracle WebLogic Server" for more information private static Context getInitialContext() throws NamingException { return new InitialContext(); } . . .
javax.rmi.PortableRemoteObject.narrow()
メソッドと組み合せてルックアップを実行するように、クライアントのコードを修正します。
RMI-IIOPクライアントが通常のRMIクライアントと異なるのは、クライアントが初期コンテキストを取得する際にプロトコルとしてIIOPが定義されるという点です。このため、ルックアップとキャストは、javax.rmi.PortableRemoteObject.narrow()
メソッドと組み合せて行われます。
たとえばRMIクライアントは、初期コンテキストを作成し、EJBeanホームをルックアップしてEJBeanへの参照を取得し、EJBean上でメソッドを呼び出します。
通常ならオブジェクトを特定のクラス型へキャストするような状況ではすべて、javax.rmi.PortableRemoteObject.narrow()
メソッドを使用する必要があります。CORBAクライアントからは、リモート・インタフェースを実装しないオブジェクトが返されることがあります。そのため、リモート・インタフェースを実装するようオブジェクトを変換するためにORBからnarrowメソッドが提供されます。たとえば、EJBeanホームをルックアップして、その結果をHomeオブジェクトにキャストするクライアント・コードは、以下に示すように、javax.rmi.PortableRemoteObject.narrow()
を使用するように修正する必要があります。
例8-2 ルックアップの実行
. . . /** * 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, "com.sun.jndi.cosnaming.CNCtxFactory"); 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
以下のようにして、クライアント側にセキュリティ・マネージャを設定します。
java -Djava.security.manager -Djava.security.policy==java.policy myclient
クライアント側のRMIインタフェースをナロー変換するには、サーバーからそのインタフェースに適したスタブが提供される必要があります。このクラスのロードは、JDKネットワーク・クラスローダーの使用を前提としており、デフォルトでは有効になっていません。これを有効にするには、適切なJavaポリシー・ファイルを使用して、クライアントにセキュリティ・マネージャを設定します。Java SEセキュリティの詳細は、Oracle Technology Networkのhttp://www.oracle.com/technetwork/java/javase/tech/index-jsp-136007.html
を参照してください。java.policy
ファイルのサンプルを以下に示します。
grant { // Allow everything for now permission java.security.AllPermission; }