Enterprise JavaBeansコンポーネントとCORBAクライアント: 開発者ガイド

このドキュメントは、CORBAによってサポートされている任意の言語で記述されたクライアントからEnterprise JavaBeansコンポーネント(EJBコンポーネント)にアクセスできるようにする方法を説明します。このドキュメントは、Java Platform, Enterprise Edition (Java EE)およびCORBA (Common Object Request Broker Architecture)に関する高度な知識をお持ちのプログラマを対象に書かれています。

Java EEテクノロジは、エンタープライズ・アプリケーションを単純化します。Java EEテクノロジにより、エンタープライズ・アプリケーションは、Enterprise JavaBeans (EJB)に基づいたモジュール型の再利用可能な標準コンポーネントに準拠するようになり、Java EEテクノロジから提供された完全なサービス・セットを利用できるようになります。アプリケーションの細かい動作の多くは、Java EEテクノロジによって自動的に処理されます。時間のかかる複雑なアプリケーション開発タスクの多くが自動化されるため、エンタープライズ開発者はインフラストラクチャの構築よりも価値の付加、つまりビジネス・ロジックの拡張に力を注ぐことができます。

EJBのサーバー側コンポーネント・モデルを使うと、トランザクションに適した、拡張性と移植性の高いミドルウェア・コンポーネントを簡単に開発できます。Enterprise JavaBeansサーバーを使用することで、トランザクション、セキュリティ、データベース接続性などのミドルウェア・サービスが自動的にサポートされるため、ミドルウェア開発の複雑さが軽減されます。

CORBAは、オブジェクト管理グループ(OMG)の規格の1つです。ベンダーに依存しないオープンなアーキテクチャと、複数のコンピュータ・アプリケーションがネットワーク経由で利用できるインフラストラクチャという特徴を備えています。CORBAベースのプログラムは、標準プロトコルであるIIOP (Internet Inter-ORB Protocol)を使って、他のCORBAベースのプログラムと連携できます。このとき、双方のプログラムの作成元ベンダーは同じでも異なっていてもかまいません。これらのプログラムが利用するコンピュータ、オペレーティング・システム、プログラミング言語、ネットワークについても、ほとんど制限はありません。CORBAの詳細は、Object Management GroupのWebサイトを参照してください。

CORBAテクノロジは分散オブジェクト・フレームワーク、そのフレームワークをサポートするサービス、および他言語との相互運用性を提供してJavaプラットフォームを補完します。CORBAテクノロジは、Java SEプラットフォームの重要な部分であり、Enterprise JavaBeansコンポーネント、標準プロトコルInternet Inter-ORB Protocol (「Java RMI-IIOP」)を利用して実行されているJava Remote Method Invocation API、およびJava IDL API (「Java IDL」)で使用されます。

OMG Interface Definition Language (IDL)は、リモート・オブジェクトによって実装されるインタフェースの説明に使用されます。IDLは、インタフェース名と個々の属性およびメソッドの名前の定義に使用されます。IDLファイルの作成後、IDLコンパイラを使ってクライアント・スタブとサーバー・スケルトンを生成できます。OMGで言語マッピングの仕様が定義されている言語であれば、どの言語でも使用できます。OMG IDLの詳細は、OMG IDLのWebサイトを参照してください。

Java IDLは、オブジェクト管理グループ(http://www.omg.org)によって定義された業界標準のOMG IDLおよびIIOPを使用して、分散Javaアプリケーションからリモート・ネットワーク・サービスを透過的に処理できるようにします。Java RMI over IIOP APIは、javax.rmi APIを介したCORBAサーバーおよびアプリケーションのプログラミングを可能にします。

EJBコンポーネントのプログラミングを行う開発者は、分散オブジェクト・モデルとしてJava RMIプログラミング・モデルを使用します。このプログラミング・モデルでは、Java RMI-IIOPがすべてのアプリケーション・サーバーに共通の必須トランスポート・プロトコルになります。異機種サーバー混在環境では、EJBアーキテクチャとCORBAの標準マッピングにより、次のような相互運用性が実現されます。

このドキュメントの残りの部分では、エンタープライズBeanオブジェクトにアクセスするCORBAクライアント・アプリケーションの例を紹介します。このドキュメントでは、Javaプログラミング言語、C++、C、Smalltalk、COBOL、Ada、Lisp、またはPythonを含む任意のCORBAサポート言語で記述されたクライアント・アプリケーションを「CORBAクライアント」と呼びます。次の例のJavaコードはエンタープライズBean固有のコードですが、Java RMI-IIOP APIを使って作成されたサーバーにアクセスするCORBAクライアントの開発プロセスは共通です。

Java EEを実装するその他のベンダーが提供する類似アプリケーションへのリンクは、「同様のその他の例へのリンク」で確認できます。




Enterprise JavaBeanコンポーネントにアクセスするCORBAクライアントの開発

次は、EJBコンポーネントにアクセスするCORBAクライアント・アプリケーションの開発例です。この例のクライアントはC++プログラミング言語で記述されていますが、実際には、CORBAによってサポートされている言語であればどの言語を使用してもかまいません。

次のセクションでは、エンタープライズBeanにアクセスできるCORBAクライアントの一般的な開発プロセスを紹介します。

  1. Enterprise JavaBeanコンポーネントの記述
  2. CORBA IDLの生成
  3. CORBAクライアントの作成
  4. Enterprise JavaBeanコンポーネントの配備
  5. クライアントの実行可能ファイルの実行

このドキュメントでは、次のトピックも取り上げます。

例を単純化するため、一部の説明を省略しています。より高度なソリューションの構築方法については、「複雑なインタフェースの使用上のヒント」を参照してください。

  1. 第I部: Enterprise JavaBeanコンポーネントの記述

    次は、Java RMI-IIOPおよびCORBAクライアントからアプリケーション・サーバーに送信された単純なStringログ・メッセージを受け付けるエンタープライズBeanのコード例です。このエンタープライズBeanは、受け付けたメッセージを現在のサーバー時間とともにサーバー上に出力します。

  2. /Java/src/ejbinteropディレクトリに、Logger.javaLoggerHome.javaLoggerEJB.javaLogMessage.javaの各ファイルを作成します。

    Logger.java

    Logger.javaファイルは、エンタープライズBeanのリモート・インタフェースとして、EJBObjectオブジェクトを拡張します。リモート・インタフェースは、EJBオブジェクトのリモート・クライアント・ビューを提供し、リモート・クライアントから呼出し可能なビジネス・メソッドを定義します。

    
    //Code Example 1: Logger.java
    package ejbinterop;
    
    import javax.ejb.EJBObject;
    import java.rmi.RemoteException;
    
    /**
     * Accepts simple String log messages and prints
     * them on the server.
     */
    public interface Logger extends EJBObject
    {
        /**
         * Logs the given message on the server with
         * the current server time.
         */
        void logString(String message) throws RemoteException;
    }
    

    LoggerHome.java

    LoggerHome.javaファイルは、EJBHomeを拡張します。EJBHomeインタフェースは、すべてのEJBコンポーネントのリモート・ホーム・インタフェースによって拡張される必要があります。ホーム・インタフェースは、リモート・クライアントによるEJBオブジェクトの作成、検索、削除を可能にするメソッドと、EJBインスタンスに固有ではないホーム・ビジネス・メソッドを定義します。

    
    //Code Example 2: LoggerHome.java
    package ejbinterop;
    
    import java.rmi.RemoteException;
    import javax.ejb.EJBHome;
    import javax.ejb.CreateException;
    
    public interface LoggerHome extends EJBHome
    {
        Logger create() throws RemoteException, CreateException;
    }
    

    LoggerEJB.java

    LoggerEJB.javaファイルには、セッションBeanのコードが格納されています。セッションBeanはクライアントによって作成されたエンタープライズBeanであり、通常、1回のクライアント・サーバー・セッションが終了するまで有効です。セッションBeanは、計算やデータベース・アクセスなどの処理を、クライアントに代わって実行します。この例のエンタープライズBeanは、クライアントから単純なStringログ・メッセージを受け付け、サーバー上に出力します。

    
    //LoggerEJB.java
    package ejbinterop;
    
    import javax.ejb.*;
    import java.util.*;
    import java.rmi.*;
    import java.io.*;
    
    /**
     * Accepts simple String log messages and prints
     * them on the server.
     */
    public class LoggerEJB implements SessionBean {
    
        public LoggerEJB() {}
        public void ejbCreate() {}
        public void ejbRemove() {}
        public void ejbActivate() {}
        public void ejbPassivate() {}
        public void setSessionContext(SessionContext sc) {}
    
        /**
         * Logs the given message on the server with
         * the current server time.
         */
        public void logString(String message) {
            LogMessage msg = new LogMessage(message);
    
            System.out.println(msg);
        }
    }
    

    LogMessage.java

    LogMessage.javaファイルは、現在日時を記録し、メッセージを示す書式付きのStringを作成し、このメッセージをサーバーに出力します。

    //LogMessage.java
    package ejbinterop;
    
    import java.io.Serializable;
    import java.util.Date;
    import java.text.*;
    
    /**
     * Simple message class that handles pretty
     * printing of log messages.
     */
    public class LogMessage implements Serializable
    {
        private String message;
        private long datetime;
    
        /**
         * Constructor taking the message. This will
         * take the current date and time.
         */
        public LogMessage(String msg) {
            message = msg;
            datetime = (new Date()).getTime();
        }
    
        /**
         * Creates a formatted String showing the message.
         */
        public String toString() {
            StringBuffer sbuf = new StringBuffer();
            DateFormat dformat
                = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,
            DateFormat.LONG);
            FieldPosition fpos = new
                FieldPosition(DateFormat.DATE_FIELD);
            dformat.format(new Date(datetime), sbuf, fpos);
            sbuf.append(": ");
            sbuf.append(message);
            return sbuf.toString();
        }
    }
    

  3. このセクションで記述したファイルをコンパイルします。次に例を示します。
    javac -classpath $JAVA_EE_HOME/lib/java_ee.jar:.. *.java
    

    これらのコマンドは、現在のディレクトリ内にすべての.javaファイルのclassファイルを作成します。このコマンドを始め、このドキュメントで取り上げるコマンドを利用するためには、環境変数JAVA_EE_HOMEを正しく設定しておく必要があります。$JAVA_EE_HOMEを使用するのは、Unixオペレーティング環境の規約です。Microsoft Windowsオペレーティング環境で作業を行う場合は、この部分を%JAVA_EE_HOME%で置き換えてください。

    第II部: CORBA IDLの生成

    このセクションでは、前のセクションで生成したJavaクラス・ファイルからインタフェース定義言語(IDL)ファイルを生成する方法を説明します。次の例では、JavaコードをIDLにマッピングする際、rmicコンパイラを使用します。IDLでは、プログラミング言語に依存せずに、宣言するだけでオブジェクトのAPIを指定することができます。

  4. 前の手順で生成したJavaクラス・ファイルに対して、次のようにしてrmicコンパイラを実行します。
    rmic -idl -noValueMethods -classpath
      $JAVA_EE_HOME/lib/java_ee.jar:<path_to_ejbinterop_dir>
      -d <path_to_where_idl_files_should_be_generated>
      ejbinterop.Logger ejbinterop.LoggerHome
    
    

    この例では、javax.ejbパッケージを定義するJARファイルとejbinteropファイルのディレクトリを取り込んでいます。Java Platform, Enterprise Edition (Java EE)リファレンス実装(RI)を使用する場合、JARファイルは$JAVA_EE_HOME/lib/java_ee.jarにあります。

    上の例のrmicのコマンド行では、処理を高速化するため、noValueMethodsオプションを使用することをお薦めします。このオプションを指定すると、rmicは、CORBA値型にマッピングされるパラメータまたは戻り値の型を持つメソッドをすべてスキップします。その結果、不要なIDLを生成してC++クライアントに実装することを防げます。ただし、この方法では、パラメータまたは戻り値として、プリミティブ・データ型、配列、およびStringsしか使用できない(Javaクラス型を使用できない)という欠点もあります。詳細については、「複雑なインタフェースの使用上のヒント」を参照してください。

    Javaクラス・ファイルに対してrmicコンパイラを実行すると、上記のrmic文の-dオプションで指定したディレクトリに、次のファイルが生成されます。

    • java/lang/Ex.idl
    • java/lang/Exception.idl
    • java/lang/Object.idl
    • java/lang/Throwable.idl
    • java/lang/ThrowableEx.idl
    • javax/ejb/CreateEx.idl
    • javax/ejb/CreateException.idl
    • javax/ejb/EJBHome.idl
    • javax/ejb/EJBMetaData.idl
    • javax/ejb/EJBObject.idl
    • javax/ejb/Handle.idl
    • javax/ejb/HomeHandle.idl
    • javax/ejb/RemoveEx.idl
    • javax/ejb/RemoveException.idl
    • ejbinterop/Logger.idl
    • ejbinterop/LoggerHome.idl

     

    注意: こうした生成ファイルの多くには、Javaプログラミング環境内でのみ使用可能なAPIが含まれています。たとえば、EJBMetaData実装は、現在では各アプリケーション・サーバーに固有です。したがって、Javaプラットフォーム以外のプラットフォームで同等のものを開発し、長期間にわたって連続運用するのは困難です。これらをIDLから削除することもできますが、Javaインタフェースに変更を加えるたびに削除処理を実行し、再度rmicコンパイラを使ってIDLファイルを生成する必要があるため、非常に面倒です。

    注: CORBA例外は継承をサポートしないため、Java言語とIDLのマッピングにより、実際のJava例外に相当するCORBA値型を含むExクラスが作成されます。ただし、ここで取り上げる例はごく基本的なものなので、例外のサポートまではあまり考慮しません。例外の詳細については、Exceptionsを参照してください。

  5. C++ベンダーの「IDLからC++への」コンパイラを使ってIDLファイルをコンパイルし、IDLに対応するC++コードを生成します。この処理の手順はベンダーによって異なります。ベンダー独自の手順については、お手元の製品文書を参照してください。

    第III部: CORBAクライアントの作成

    クライアント・アプリケーションは、CORBAによってサポートされている任意の言語で記述できます。次に、Object Request Broker (ORB)とLoggerHomecorbaname URLを持つ単純なC++クライアントのコードを紹介します。サーバー上の単純なStringメッセージを記録するコードです。include文に変更を加え、C++ORBベンダーのライブラリに従って値ファクトリ登録コードを修正する必要があります。この例はORBacus for C++4.0.5用であり、一部はこの製品固有のC++コードです。

    corbaname URLは、ユーザーが読むことのできる形式のURLであり、CORBAオブジェクトへのアクセスを可能にします。これを使って、特定のネーミング・コンテキストから文字列化された名前を取得する(名前解決を行う)ことができます。これは、CORBA Interoperable Naming Service (INS)の一部です。INSは、Java EEプラットフォームの以前のリリースで配布されたCORBA Object Services (COS)ネーム・サービスの拡張です。INSの詳細は、「Interoperable Naming Service」を参照してください。

    この例のクライアント・コードは、次の処理を実行します。

    • Object Request Broker (ORB)の作成。ORBは、オブジェクト要求サービスをその提供元オブジェクトに接続する。
    • 値ファクトリの登録。
    • corbaname URLのポイント先ネーミング・コンテキストでLoggerHomeオブジェクトを検索する。
    • LoggerHomeオブジェクトへ返されるオブジェクトから安全なダウンキャストを実行する。
    • LoggerEJBオブジェクト参照の作成。
    • メッセージの記録。
    • このEJB参照を再利用しないことをアプリケーション・サーバーに通知する。
  6. 次のようなC++コードを使ってクライアントを作成します。実際のコードはC++実装によって異なります。この例はORBacus for C++4.0.5用であり、一部はこの製品固有のC++コードです。
    //Code Example: Client.cpp
    #include <fstream.h>
    
    // C++ ORB Vendor specific include files
    // These are from C++ ORBacus 4.0.5
    
    #include <OB/CORBA.h>
    #include <OB/OBORB.h>
    
    // Include files generated from our IDL
    #include <java/lang/Exception.h>
    #include <java/lang/Throwable.h>
    #include <javax/ejb/CreateException.h>
    #include <javax/ejb/RemoveException.h>
    #include <ejbinterop/Logger.h>
    #include <ejbinterop/LoggerHome.h>
    
    /**
     * Given an ORB and a corbaname URL for a LoggerHome
     * object, logs a simple string message on the server.
     */
    void
    run(CORBA::ORB_ptr orb, const char* logger_home_url)
    {
      cout << "Looking for: " << logger_home_url << endl;
    
      // Look up the LoggerHome object in the naming context
      // pointed to by the corbaname URL
      CORBA::Object_var home_obj
        = orb->string_to_object(logger_home_url);
    
      // Perform a safe downcast
      ejbinterop::LoggerHome_var home
        = ejbinterop::LoggerHome::_narrow(home_obj.in());
    
      assert(!CORBA::is_nil(home));
    
      // Create a Logger EJB reference
      ejbinterop::Logger_var logger = home->create();
    
      CORBA::WStringValue_var msg =
        new CORBA::WStringValue((const CORBA::WChar*)L"Message
          from a C++ client");
    
      cout << "Logging..." << endl;
    
      // Log our message
      logger->logString(msg);
    
      // Tell the application server we won't use this
      // EJB reference any more
      logger->remove();
    
      cout << "Done" << endl;
    }
    
    /**
     * Simple main method that checks arguments, creates an
     * ORB, and handles exceptions.
     */
    int
    main(int argc, char* argv[])
    {
      int exit_code = 0;
      CORBA::ORB_var orb;
    
      try {
    
      // Check the arguments
      if (argc != 2) {
        cerr << "Usage: Client <corbaname URL of LoggerHome>" << endl;
        return 1;
      }
    
      // Create an ORB
      orb = CORBA::ORB_init(argc, argv);
    
      // Register value factories
    
      // NOTE: This is overkill for the example since we'll never
      // get these exceptions.  Also, the _OB_id method is a
      // proprietary feature of ORBacus C++ generated code.
      CORBA::ValueFactory factory = new java::lang::Throwable_init;
      orb -> register_value_factory(java::lang::Throwable::_OB_id(),
        factory);
      factory -> _remove_ref();
    
      factory = new java::lang::Exception_init;
      orb -> register_value_factory(java::lang::Exception::_OB_id(),
        factory);
      factory -> _remove_ref();
    
      factory = new javax::ejb::CreateException_init;
      orb ->                 register_value_factory(javax::ejb::CreateException::_OB_id(),
          factory);
      factory -> _remove_ref();
    
      factory = new javax::ejb::RemoveException_init;
      orb ->
        register_value_factory(javax::ejb::RemoveException::_OB_id(),
          factory);
      factory -> _remove_ref();
    
      // Perform the work
      run(orb, argv[1]);
    
    } catch(const CORBA::Exception& ex) {
      // Handle any CORBA related exceptions
      cerr << ex._to_string() << endl;
      exit_code = 1;
    }
    
      // Release any ORB resources
      if (!CORBA::is_nil(orb)) {
        try {
          orb -> destroy();
        } catch(const CORBA::Exception& ex) {
          cerr << ex._to_string() << endl;
          exit_code = 1;
        }
      }
    
      return exit_code;
    }
    
  7. C++コンパイラを使って、Client.cppファイルを含むすべてのC++ファイルをコンパイルし、クライアントの実行可能ファイルを作成します。プラットフォームによって使用するツールが異なるため、お手元の製品文書で詳細を確認してください。

    第IV部: Enterprise JavaBeanコンポーネントの配備

  8. 好みのアプリケーション・サーバーを使って、エンタープライズBeanを配備します。次は、Java EEリファレンス実装(RI)を使ってLoggerEJBコンポーネントを配備する例です。
    1. RIアプリケーションを開始します。端末ウィンドウまたはコマンド・プロンプトに次のコマンドを入力してください。
         $JAVA_EE_HOME/bin/java_ee -verbose
      
    2. Java EE RIから「Java EEサーバーの起動が完了しました。」というメッセージが表示されたら、別の端末ウィンドウまたはコマンド・プロンプトから配備ツールを実行します。次を入力してください。
         $JAVA_EE_HOME/bin/deploytool
      
    3. 配備ツールの「ファイル」 -> 「新規」 -> 「アプリケーション」を選択します。
    4. 「アプリケーションのファイル名」フィールドにLogger.earと入力し、アプリケーションを作成するファイルを指定します。
    5. 「アプリケーションの表示名」フィールドにLoggerと入力します。
    6. 「了解」を選択し、設定を保存してダイアログ・ウィンドウを閉じます。
    7. 配備ツールの「ファイル」 -> 「新規」 -> 「エンタープライズBean」を選択します。
    8. 「紹介」画面が表示されたら、「次」を選択します。表示されない場合は続行します。
    9. 「新規エンタープライズBeanウィザード」の「コンテンツ」ボックスから「編集」を選択します。
    10. 「使用可能なファイル」リストを展開し、ejbinteropパッケージから4つの.classファイル(Logger.classLoggerHome.classLoggerEJB.classLogMessage.class)を追加します。「了解」を選択し、「次」を選択します。
    11. 「ステートレス・セッション Bean タイプ」を選択します。
    12. 「エンタープライズ Bean クラス」ejbinterop.LoggerEJBを選択します。
    13. 「リモート・ホーム・インタフェース」ejbinterop.LoggerHomeを選択します。
    14. リモート・インタフェース」のejbinterop.Loggerを選択します。
    15. 「セキュリティ設定」ページが表示されるまで、「次」ボタンを繰返し押します。
    16. 「配備値の設定」ボタンを選択します。
    17. 「サポートするクライアントの選択」を選択します。
    18. 「了解」を選択し、設定を保存してダイアログ・ウィンドウを閉じます。
    19. 「完了」を選択します。
    20. 配備ツールの「ツール」 -> 「配備」を選択します。
    21. Java RMI-IIOPクライアントのみを実行している場合は、「クライアントJARを返します」を選択します。
    22. 「次」を選択します。
    23. JNDI 」のLoggerEJBフィールドにejbinterop/loggerと入力します。
    24. 「完了」を選択します。
    25. 「ファイル」->「終了」を選択して、配備ツールを終了します。

    これで、LoggerアプリケーションとLoggerEJBコンポーネントが配備され、メッセージを受信する準備ができました。

    第V部: クライアントの実行可能ファイルの実行

  9. クライアントの実行可能ファイルを実行します。たとえば、実行可能クライアント・ファイルが入っているディレクトリから端末ウィンドウ内に次のURLを入力するという方法があります。
    Client corbaname:iiop:1.2@localhost:1050#ejbinterop/logger
    

    このURLの各部分の解説は次のとおりです。

    • Clientは実行するアプリケーションの名前。
    • corbanameは特定のネーミング・コンテキストから文字列化された名前を取得することを指定。
    • iiop:1.2はORBにIIOPプロトコルとGIOP 1.2を使用するように指示。
    • 参照を検索するホスト・マシンはローカル・マシンlocalhost。この例を応用して2台のマシンを実行する場合は、localhostの位置にサーバーを実行するマシンのIPアドレスまたはホスト名を入力する。
    • 1050はネーミング・サービスが要求を待機するポート。Java EE RIでは、ネーミング・サービスが待機するデフォルト・ポートは1050。参照部分からハッシュ・マークのあるポイント(Client corbaname:iiop:1.2@localhost:1050)までが、ルート・ネーミング・コンテキストを返すURL。
    • ejbinterop/loggerは解決するネーミング・コンテキスト内の名前。

    Java EEリファレンス実装を使用している場合は、アプリケーション・サーバー上に次のようなメッセージが表示されます。

    
    Sep 21, 2001 3:33:07 PM PDT: Message from a C++ client ejbinterop/
    logger is the name to be resolved from the Naming Service.
    

    第VI部: Java EEサーバーの停止

  10. Java EEサーバーを停止します。サーバーを停止するには、端末ウィンドウまたはコマンド・プロンプトに次のコマンドを入力します。
    $JAVA_EE_HOME/bin/java_ee -stop
    

    実行プロセスの終了手順はオペレーティング・システムによって異なります。異なったサーバーを使用している場合は、システム文書で詳細を確認してください。




Java RMI-IIOPクライアント・アプリケーションの作成

ここまでの例を使って、エンタープライズBeanに接続するJava RMI-IIOPクライアントを簡単に開発できます。次に、C++クライアントを使用する例との違いを挙げておきます。

次は、LoggerEJBコンポーネントのJava RMI-IIOPバージョンのクライアントのコードです。C++クライアントの例と同じ手順に従います。クライアントの実行時は、C++の例と同じURLを使用します。

//Code Example: LogClient.java
package ejbinterop;

import java.rmi.RemoteException;
import javax.rmi.*;
import java.io.*;
import javax.naming.*;
import javax.ejb.*;

/**
 * Simple Java RMI-IIOP client that uses an EJB component.
 */
public class LogClient
{
    /**
     * Given a corbaname URL for a LoggerHome,
     * log a simple String message on the server.
     */
    public static void run(String loggerHomeURL)
        throws CreateException, RemoveException,
               RemoteException, NamingException
    {
        System.out.println("Looking for: " + loggerHomeURL);

        // Create an InitialContext. This will use the
        // CosNaming provider we will specify at runtime.
        InitialContext ic = new InitialContext();

        // Lookup the LoggerHome in the naming context
        // pointed to by the corbaname URL
        Object homeObj = ic.lookup(loggerHomeURL);

        // Perform a safe downcast
        LoggerHome home
            = (LoggerHome)PortableRemoteObject.narrow(homeObj,
        LoggerHome.class);

        // Create a Logger EJB reference
        Logger logger = home.create();

        System.out.println("Logging...");

        // Log our message
        logger.logString("Message from a Java RMI-IIOP client");

        // Tell the application server we won't use this
        // EJB reference anymore
        logger.remove();

        System.out.println("Done");
    }

    /**
     * Simple main method to check arguments and handle
     * exceptions.
     */
    public static void main(String args[])
    {
        try {

            if (args.length != 1) {
                System.out.println("Args: corbaname URL of LoggerHome");
                System.exit(1);
            }

            LogClient.run(args[0]);

        } catch (Throwable t) {
            t.printStackTrace();
            System.exit(1);
        }
    }
}

Java RMI-IIOPクライアントでアプリケーションを実行

C++クライアントではなくJava RMI-IIOPクライアントでアプリケーション例を実行するには、次の手順に従ってください。

  1. 次のコマンドを使って、ejbinterop /ディレクトリ内の.javaファイルをコンパイルします。
    javac -classpath $JAVA_EE_HOME/lib/java_ee.jar:<ejbinterop_directory> *.java
    
  2. 「Enterprise JavaBeanコンポーネントの配備」の説明に従ってEnterprise JavaBeanコンポーネントを配備します。Java RMI-IIOPクライアント・アプリケーションの実行時は、必ず「ツール」->「配備」を選択し、「クライアントJARを返します」を選択してください。Java EE RIまたはその他のアプリケーション・サーバーを起動する方法については、配備に関する説明を参照してください。
  3. 次のようなコマンドを使って、クライアント・アプリケーションを実行します。
    java -classpath $JAVA_EE_HOME/lib/java_ee.jar:
    <path to LoggerClient.jar>/LoggerClient.jar:
    <directory_above_ejbinterop>:<ejbinterop_directory>
    ejbinterop.LogClient
    corbaname:iiop:1.2@localhost:1050#ejbinterop/logger 
    

    Java EE RIを実行しているウィンドウに、これが表示されます。

    Jan 31, 2002 2:27:47 PM PST: Message from a Java RMI-IIOP client
    

    クライアントを実行しているウィンドウには、次のメッセージが表示されます。

    Looking for: corbaname:iiop:1.2@localhost:1050#ejbinterop/logger
    Logging...
    Done
    
  4. Java EEサーバーを停止します。



基本アプリケーションの拡張

このセクションでは、次のトピックを取り上げます。

拡張の利点

アプリケーションの拡張により、次のことが可能になります。

複雑なインタフェースの使用上のヒント

インタフェースは、それぞれ異なった言語を使用するクライアントとサーバー間の通信において重要な役割を果たします。次のヒントを参考にすることにより、この領域で成功する確率を高めることができます。

同様のその他の例へのリンク

Java EEテクノロジを実装するベンダーの多くは、CORBAとEnterprise JavaBeansテクノロジを統合する優れた例とヒントを提供しています。たとえば、EJB-to-CORBA/Java Simpappサンプルアプリケーションを参照してください。


Copyright © 1993, 2020, Oracle and/or its affiliates. All rights reserved.