
        
        連載
        
        スキルアップのための分散オブジェクト入門
第4回 開発手順から理解するJavaRMIとEJB
          
| 日本アイオナテクノロジーズ 主席 コンサルタント 小野沢 博文 2002/6/22  | 
          本連載について | 
        
| 今回は、JavaRMIとEJBを扱います。JavaRMI(Java Remote Method Invocation)は、Javaオブジェクトのリモート・メソッド呼び出し機能で、J2SEに含まれています。一方、EJB(Enterprise JavaBeans)は、Javaによるコンポーネント開発のためのフレームワークで、J2EEに含まれています。EJBは、リモート・メソッド呼び出しのためにJavaRMIを使用しています。 | 
| JavaRMIとEJB | 
|  
             今回の内容 
           | 
        
それでは、JavaRMIとEJBの特徴を見ていきましょう。EJBは、COM+と同様に、単なる分散オブジェクト技術にとどまらず、コンポーネント開発のためのフレームワークを提供しています。しかし、ここではEJBの分散オブジェクトとしての側面だけに焦点を当てていきます。
| ■JavaRMIとEJBの特徴 | 
最初にJavaRMIとEJBの特徴を簡単にまとめておきます。
●特定のOSに依存しないピュアJavaのための分散オブジェクト技術
         JavaRMIとEJBが特定のOSに依存しないのは、JavaのOS非依存性のおかげです。従って、J2SEが使える環境であれば、どこでもJavaRMIのご利益にあずかることができますし、製品がサポートする環境であれば、どこでもEJBを使うことができます。
        
          JavaRMIとEJBは、JavaのJavaによるJavaのための分散オブジェクト技術です。当然ながら、非分散Javaプログラムとの相性が良く、従来のJavaアプリケーションをほんのわずか修正するだけで、JavaRMIベースの分散アプリケーションに変更することができてしまいます。
        
        ●Javaのインターフェイスでリモート・インターフェイスを定義する
         これは1つ目の特徴と関連しますが、JavaRMIとEJBではJavaインターフェイスでリモート・オブジェクトのインターフェイス定義を行います。このため、CORBAのIDLのような新たなインターフェイス定義言語を習得する必要がありません。 
        
        
        ●RMI 
        over IIOPによる相互運用性
         JavaRMIとEJBはピュアJavaソリューションですが、決して閉鎖的ではなく、ほかの分散オブジェクト技術と接続することができます。その場合、RMI 
        over IIOPが使用されます。
|  
             TIPS1 JRMPとRMI 
              over IIOP 
           | 
        |
|   JavaRMIには2つの通信プロトコルがあります。正確にいうと、これ以外のベンダ固有プロトコルを実装している製品もありますが、ここでは2つの標準プロトコルだけを考えます。 第1のプロトコルは、JRMP(Java Remote Method Protocol)と呼ばれるJavaRMIのネイティブなプロトコルです。これはJavaRMIでしかサポートされていないため、このプロトコルで通信する場合には、相手もJavaRMIに限定されます。 JavaRMIのもう1つのプロトコルは、EJBでも採用されているRMI over IIOPです。こちらのプロトコルを使うことで、Java以外の相手との通信が可能になります。一方、JavaRMIではローカル・オブジェクトをリモート・メソッドの引数として受け渡しすることができますが、その場合、引数として渡されたオブジェクトのコピーが相手に送り届けられることになります。一般に、このような引数の渡し方を「値渡し」と呼んでいます。ところが、もともとのCORBAにはオブジェクトの値渡しという概念がありませんでした。そこで、RMI over IIOP仕様を策定する際に「値型」と呼ばれる新たな型がCORBAのIDLに追加されて、これによってオブジェクトの値渡しが実現されました。 この値オブジェクトがJavaのローカル・オブジェクトに相当するのですが、CORBAプログラマから見ると複雑怪奇で扱いにくいデータ型が導入されるはめになってしまったわけです。この辺りの注意点は、連載第1回のTIPS3をご覧ください。  | 
        |
| ■開発手順からJavaRMIを知る | 
ここで、JavaRMIを使用したアプリケーションの開発手順を追いながら、その特徴をもう少し詳しく見ていくことにします。
●インターフェイス定義
        
         JavaRMIのアプリケーションを作成する場合、まずJavaインターフェイスでオブジェクトのインターフェイスを定義します。 リスト1がインターフェイス定義の例です。通常のローカル・オブジェクトのJavaインターフェイスと異なる点は、java.rmi.Remoteインターフェイスを拡張している(extends)点と、各メソッドがjava.rmi.RemoteException例外をスローする点だけです。
| リスト1 インターフェイス定義例 | 
 public interface Customer extends java.rmi.Remote {  | 
        
●サーバ・プログラムの作成
        
          次にこのインターフェイスをサポートするサーバ・クラスを作成します。これも非常に簡単で、図1のCustomerインターフェイスの各メソッドにアプリケーション・ロジックを実装するだけです。
 さらにメイン・プログラムも作成する必要があります。メイン・プログラムでは、リモート・オブジェクトの作成とオブジェクト・リファレンスの登録を行います。オブジェクト・リファレンスの登録には、JNDI(用語解説1)またはRMIレジストリ(用語解説2)のいずれかを使用します。
      
| 用語解説2 RMIレジストリ | 
| JavaRMIのオブジェクト・リファレンスを名前付きで登録、検索するための簡易ネーミング・サービス。 | 
●スタブとスケルトンの生成
        
         上記で作成したサーバの実装クラスから、rmicコンパイラを使用してスタブとスケルトンコードを生成します。JavaRMIでは、インターフェイス定義からではなく実装クラスからスタブとスケルトンを生成する点に注意してください。また、これらはクラス・ファイルとして生成されます(オプションでソース・ファイルを残すことも可能です)。また、rmicコンパイラの引数で、JRMPを使用するのかRMI 
        over IIOPを使用するのかを選択することができます。 
![]()  | 
        
| 図2 インターフェイス定義、実装クラス、スタブ、スケルトンの関係 | 
●クライアント・プログラムの作成
        
         クライアント・プログラムでは、JNDIまたはRMIレジストリを使用して、リモート・オブジェクトのリファレンスを取得します。そして、リファレンスを使用してリモート・オブジェクトのメソッドを呼び出します。
| ■開発手順からEJBを知る | 
前項で見たように、JavaRMIのサーバ開発者は、メイン・プログラムを作成し、その中でオブジェクトの作成やネーミング・サービスへの登録処理を行う必要がありました。この点はCORBAとまったく同じです。これに対して、EJBのサーバ開発者は、メイン・プログラムを作成しません。そして、オブジェクトの作成やネーミング・サービスへの登録といった定型的な処理は、EJBコンテナがすべて自動的に行ってくれるので、サーバ開発者は、インターフェイス定義とビジネス・ロジックの実装に専念することができます。具体的にサーバ開発者が作成するのは次の4つだけです。
- リモート・インターフェイス
 - Homeインターフェイス
 - Enterprise Beanの実装クラス
 - デプロイメント・ディスクリプタ
 
リモート・インターフェイスはオブジェクト(Enterprise Bean:以下では単にBeanと呼ぶことにします)の外部インターフェイスで、JavaRMIやCORBAのインターフェイス定義と同じ役割を果たします。Homeインターフェイスは、クライアントがBeanインスタンスの作成、検索、あるいは削除を要求するためのファクトリ・インターフェイスです。次の実装クラスは、サーバ・アプリケーションの中心部で、ここでは主にBeanのビジネス・メソッドを実装します。最後のデプロイメント・ディスクリプタでは、Beanの種類、クラス名、トランザクション属性、アクセス制御情報などを設定します。トランザクションやセキュリティの制御は、ここでの設定を基に実行時にEJBコンテナが自動的に行ってくれます。従って、サーバ開発者がこれらの処理をハードコードする必要はありません。
 このように、EJBではサーバ開発者はBeanの実装だけに専念できますので、これをうまく使うことで開発生産性を高めることができます。
      
|  
             TIPS2 EJBで本当に生産性が上がるのか? 
           | 
        |
|  上で説明したように、EJBではコンテナがBeanのインスタンス化、ネーミング・サービスへの登録、トランザクション制御、アクセス制御などを自動的に行ってくれるため、サーバ開発者はアプリケーション・ロジックの実装に思い切り専念することができます。これに加えてさらに、一度開発したBeanの再利用によって開発生産性を向上させることができるというのが、EJBの宣伝文句の1つです。 この宣伝はうそではありませんが、生産性を向上させるためにはいくつかの条件をクリアしなければなりません。正しい設計、技術者のスキル、適切なプロジェクト管理、適切な適用分野、などなどがクリアしなければならない代表的な条件ですが、ここでは最後の適用分野について考えてみましょう。どんな技術にも得手不得手があり、その技術がぴたりと当てはまる分野で使わなければ、逆に生産性が下がってしまうことになります。EJBの場合がまさにそうです。 それでは、EJBが得意とする分野はどこでしょうか。典型的な例は、J2EEのブループリントに載っているようなWebアプリケーション・サーバの開発です。 逆に、苦手な分野はどこなのでしょうか。EJBの苦手分野の典型は、複数言語のアプリケーションが混在している環境、単なるアプリケーション間の通信インフラとして使いたい場合、ほかの通信プロトコルを同時に処理しなければならない場合、などなどです。これらのケースでは、EJBのさまざまな制限が顕在化してきます。EJBの制限事項を羅列してみると、次のようなものです。 
 誤解していただきたくないのは、ここでは「EJBよりもCORBAの方が優れている」ということがいいたいわけではありません。ここで声を大にしていいたいのは、「EJBとCORBAを適材適所で使い分けることが重要である」ということです。適材適所で思い出しましたが、Webサービスと従来の分散オブジェクト技術も、適材適所で使い分けないと失敗します。これについては、本連載の最後の方でお話ししたいと思います。  | 
        |
| INDEX | |
| スキルアップのための分散オブジェクト入門 | |
| 第1回 分散オブジェクト技術が必要なわけ(2002/3/19) | |
| 第2回 分散オブジェクトのしくみを理解する(2002/4/4) | |
|  
             第3回 開発手順からCORBAを理解する(2002/4/25)  | 
        |
| 第4回 開発手順から分かるEJBとJavaRMI(2002/6/25) | |
| 第5回 分散オブジェクト技術としてのHORBとCOM+(2002/8/21) | |
| 第6回 現実モデルはWebサービスとの共存(2002/10/4) | |
| Java Solution全記事一覧 | 
- 実運用の障害対応時間比較に見る、ログ管理基盤の効果 (2017/5/9)
ログ基盤の構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。今回は、実案件を事例とし、ログ管理基盤の有用性を、障害対応時間比較も交えて紹介 - Chatwork、LINE、Netflixが進めるリアクティブシステムとは何か (2017/4/27)
「リアクティブ」に関連する幾つかの用語について解説し、リアクティブシステムを実現するためのライブラリを紹介します - Fluentd+Elasticsearch+Kibanaで作るログ基盤の概要と構築方法 (2017/4/6)
ログ基盤を実現するFluentd+Elasticsearch+Kibanaについて、構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。初回は、ログ基盤の構築、利用方法について - プログラミングとビルド、Androidアプリ開発、Javaの基礎知識 (2017/4/3)
初心者が、Java言語を使ったAndroidのスマホアプリ開発を通じてプログラミングとは何かを学ぶ連載。初回は、プログラミングとビルド、Androidアプリ開発、Javaに関する基礎知識を解説する。 
 
  | 
 |





