スタンドアロン クライアント プログラマーズ ガイド

     前  次    新しいウィンドウで目次を開く     
ここから内容の開始

J2SE クライアントの開発

J2SE クライアントは J2EE プログラミング モデルを指向しており、WebLogic Server クラスなしで RMI の機能と IIOP プロトコルが一体化されています。以下の節では、J2SE クライアントの開発について説明します。

 


J2SE クライアントの基礎

J2SE クライアントは、J2EE または J2SE コンテナ (ほとんどの場合、JDK 1.3 以降) をホストとする RMI-IIOP 対応 ORB を実行します。J2SE クライアントには以下の特性があります。

 


J2SE クライアントの開発方法

RMI クライアント使用型 RMI-IIOP を用いてアプリケーションを開発するには、以下の手順に従います。

  1. リモート オブジェクトのパブリック メソッドを、java.rmi.Remote を拡張するインタフェースに定義します。
  2. このリモート インタフェースには、コードをあまり記述する必要がない場合もあります。必要なのは、リモート クラスで実装するメソッドのメソッド シグネチャだけです。次に例を示します。

    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;
    }
  3. interfaceNameImpl というクラスにインタフェースを実装し、それを JNDI ツリー内にバインドしてクライアントから利用できるようにします。
  4. このクラスには、記述済みのリモート インタフェースを実装する必要があります。これにより、インタフェースに含まれるメソッド シグネチャを実装したことになります。すべてのコード生成はこのクラス ファイルに依存します。通常は、実装クラスを 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);
    }
  5. リモート インタフェースと実装クラスを Java コンパイラでコンパイルします。RMI-IIOP アプリケーションでのこれらのクラスの開発は、通常の RMI での開発と同じです。RMI オブジェクトの開発の詳細については、「WebLogic RMI について」を参照してください。
  6. 実装クラスに対して WebLogic RMI または EJB コンパイラを実行して、必要な IIOP スタブを生成します。以下に示すように、IIOP スタブの生成に -iiop オプションを使用する必要はありません。
  7. $ java weblogic.rmic nameOfImplementationClass

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

  8. ここまでで作成したファイル、すなわち、リモート インタフェース、それを実装するクラス、およびスタブを WebLogic Server の CLASSPATH に指定します。
  9. 初期コンテキストを取得します。
  10. RMI クライアントでは、初期コンテキストを作成しリモート オブジェクトをルックアップして (次のステップを参照)、オブジェクトにアクセスします。続いて、このオブジェクトが適切な型にキャストされます。

    初期コンテキストの取得では、JNDI コンテキスト ファクトリを定義する際に com.sun.jndi.cosnaming.CNCtxFactory を使用する必要があります (WebLogic Server 8.1 では、WLInitialContextFactory はこのクライアント用として非推奨)。パラメータとして新しい InitialContext() に渡す「Context.INITIAL_CONTEXT_FACTORY」プロパティの値を設定する際には、com.sun.jndi.cosnaming.CNCtxFactory を使用します。

    注意 : Sun JNDI クライアントでは、ネームスペースからリモート オブジェクト参照を読み込む機能はサポートされていますが、シリアライズされた汎用 Java オブジェクトの読み込みはサポートされていません。つまり、ネームスペースから EJBHome などを読み込むことはできますが、DataSource オブジェクトを読み込むことはできません。このコンフィグレーションでは、クライアントで開始されたトランザクション (JTA API) もサポートされません。また、セキュリティもサポートされていません。次のステートレス セッション Bean の RMI クライアントのサンプルでは、以下のコードで初期コンテキストを取得します。
    InitialContext の取得 :

    .
    .
    * JDK1.3 以降のクライアントでは、次のように Properties オブジェクトを使用すると
    * 機能する
       */
      private Context getInitialContext() throws NamingException {
    try {
      // 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;
      }
    /**
    * Java2 バージョンを使用して InitialContext を取得する場合。
    * このバージョンは、jndi.properties ファイルがアプリケーションのクラスパス
    * に存在するかどうかに依存する。詳細については、
    * 『WebLogic JNDI プログラマーズ ガイド』を参照。
    private static Context getInitialContext()
      throws NamingException
    {
      return new InitialContext();
    }
    .
    .
    .
  11. javax.rmi.PortableRemoteObject.narrow() メソッドと組み合わせてルックアップを実行するように、クライアントのコードを修正します。
  12. 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() を使用するように修正する必要があります。

    ルックアップの実行 :
    .
    .
    .
    /**
     * RMI/IIOP クライアントではこの narrow 関数を使用する必要がある
     */
    private Object narrow(Object ref, Class c) {
      return PortableRemoteObject.narrow(ref, c);
    }
    /**
     * JNDI ツリーで EJB ホームをルックアップ
     */
    private TraderHome lookupHome()
      throws NamingException
    {
      // JNDI を使用して Bean ホームをルックアップ
      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;
      }
    }
    /**
     * JDK1.3 以降のクライアントでは、次のように Properties オブジェクトを使用すると
     * 機能する
     */
    private Context getInitialContext() throws NamingException {
      try {
      // 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";
  13. 次のようなコマンドでクライアントを実行することで、IIOP を通じてクライアントをサーバに接続します。
  14. $ java -Djava.security.manager -Djava.security.policy=java.policy    examples.iiop.ejb.stateless.rmiclient.Client iiop://localhost:7001
  15. 以下のようにして、クライアント側にセキュリティ マネージャを設定します。
  16. java -Djava.security.manager -Djava.security.policy==java.policy myclient

    クライアント側の RMI インタフェースをナロー変換するには、サーバからそのインタフェースに適したスタブが提供される必要があります。このクラスのロードは、JDK ネットワーク クラスローダの使用を前提としており、デフォルトでは有効になっていません。これを有効にするには、適切な Java ポリシー ファイルを使用して、クライアントにセキュリティ マネージャを設定します。Java セキュリティの詳細については、Sun のサイト (http://java.sun.com/security/index.html) を参照してください。java.policy ファイルのサンプルを以下に示します。

    grant {

    // 一時的にパーミッションを付与する

    permission java.security.AllPermission;

    }


  ページの先頭       前  次