プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle WebLogic Serverスタンドアロン・クライアントの開発

E90343-01
目次へ移動
目次

前
次

8 Java SEクライアントの開発

Java SEクライアントを開発および使用する方法について説明します。Java SEクライアントはJava EEプログラミング・モデルを指向しており、WebLogic ServerクラスなしでRMIの機能とIIOPプロトコルが一体化されています。

この章の内容は次のとおりです。

Java SEクライアントの基本

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によってサポートされます。

Java SEクライアントの開発方法

RMIクライアント使用型RMI-IIOPを使用してアプリケーションを開発する方法について説明します。

RMIクライアント使用型RMI-IIOPを用いてアプリケーションを開発するには:

  1. リモート・オブジェクトのパブリック・メソッドを、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;
    }
    
  2. 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);
    }
    
  3. リモート・インタフェースと実装クラスをJavaコンパイラでコンパイルします。RMI-IIOPアプリケーションにおけるこれらのクラスの開発は、通常のRMIでの開発と同じです。RMIオブジェクト開発の詳細は、『Oracle WebLogic Server RMIアプリケーションの開発』を参照してください。

  4. 実装クラスに対してWebLogic RMIまたはEJBコンパイラを実行して、必要なIIOPスタブを生成します。以下に示すように、IIOPスタブの生成に-iiopオプションを使用する必要はありません。

    $ java weblogic.rmic nameOfImplementationClass
    

    スタブはリモート・オブジェクト用のクライアント側プロキシで、個々のWebLogic RMI呼出しを対応するサーバー側スケルトンに転送します。続いてサーバー側スケルトンが、その呼出しを実際のリモート・オブジェクト実装に転送します。なお、WebLogic RMIコンパイラで作成されるIIOPスタブは、JDK 1.3.1_01以降のORBで使用するためのものです。他のORBを使用する場合、それぞれのORBベンダーのドキュメントを参照して、これらのスタブが適切かどうかを判断してください。

  5. ここまでで作成したファイル、すなわち、リモート・インタフェース、それを実装するクラス、およびスタブをWebLogic ServerのCLASSPATHに指定します。

  6. 初期コンテキストを取得します。

    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クライアントのサンプルでは、この項の終わりの「InitialContextの取得」で示されるように初期コンテキストを取得します。

  7. 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. 次のようなコマンドでクライアントを実行することで、IIOPを通じてクライアントをサーバーに接続します。

    $ java -Djava.security.manager -Djava.security.policy=java.policy examples.iiop.ejb.stateless.rmiclient.Client iiop://localhost:7001
    
  9. 以下のようにして、クライアント側にセキュリティ・マネージャを設定します。

    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;
    }
    

例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();
}
.
.
.

例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";