分散オブジェクト環境を学ぶ

連載:HORBと遊ぼう(4)

HORBでサーバアプリケーションを作ろう

萩本順三
HORB Openマネージャ
株式会社豆蔵
2001/2/18


 (2)接続モデルって何だ?

 すでに分散オブジェクト製品を使ったことがある方は、生成モデルの使いやすさを実感されたと思います。生成モデルは、ほかの分散オブジェクト製品にはない良さを持っています。ほかの分散オブジェクト技術では、代理オブジェクト1つにリモートオブジェクト1つを割り付けるにはサーバプログラムでちょっとした工夫が必要となるので、生成モデルのように簡単ではありません(注1)。このように、生成モデルは、非常にJava言語にシームレスな分散オブジェクト環境を提供します。でも、生成モデルの使いやすさの半面、何かが足りないと思った方も多いのではないでしょうか。そうです、生成モデルにも欠点があるのです。

注1: 実際には、対象となるリモートオブジェクトの代理オブジェクトを返却するメソッドを持つリモートクラスをサーバアプリケーション上で立ち上げる必要があります。

 生成モデルの場合、クライアント側から代理オブジェクト(Proxy)が生成(new)されるときにサーバ側でリモートオブジェクトが生成(new)されます。よって、サーバ側で2、3個のリモートオブジェクトを立ち上げてクライアントからサービスするといったようなケースでは、生成モデルは不向きなのです。なぜなら代理オブジェクトが1000個できるとそれに対応するリモートオブジェクトが1000個できるからです。

 また、稼働中のサーバアプリケーションがすでに何らかのサービスを提供していたとします。そのサーバアプリケーションにクライアントから接続して、サービスを受けるようにしたい場合、生成モデルではすでに稼働中のサーバアプリケーションのサービスを受けることができにくいのです。なぜなら、生成モデルの場合は、あくまでクライアントから代理オブジェクトの生成(new)が行われたときに、サーバ側でHORBサーバによって自動的に生成(new)されるのです。よってすでにサービスを提供中のほかのオブジェクトが自動的に生成されたリモートオブジェクトを認識(参照)する術がないのです(注2)

注2: サーバアプリケーションが実行しているプロセスの中で、HORBをスレッド起動(new HORBServer)しておき、サービスを提供するクラスにstaticメソッドを用意して、生成モデルのリモートオブジェクトからそのメソッドを呼び出せば可能となりますが、あまり良い設計とはいえませんね。

 さて、このようなときはどう対処すればよいと思いますか? やりたいことは、すでに稼働中のサーバアプリケーションのサービスをクライアントから受けることです。これをもっと簡潔にいうと、「すでに稼働中のオブジェクトのサービスをクライアントから受ける」ことです。

 前置きが長くなりましたが、このようなソリューションには、HORBの接続モデルが適しています。接続モデルは、最初にサーバ側でリモートオブジェクトに名前を付けて起動しておいて、クライアントから代理オブジェクト(Proxy)の生成(new)時に名前指定で、リモートオブジェクトに接続させることができるという機能です。

 リスト3を見てください。このソースは、リスト2のRemoteInstanceTest.javaのホスト名を指定する部分をプログラム起動引数から与えるように変更しています(7行目と8行目)。この部分でホスト名の後にオブジェクトIDを指定すると接続モデルとなり、すでに起動されているリモートオブジェクトへの接続が可能となります。

001:public class RemoteTest{
002:  public static void main( String argv[] ){
003:    if(argv.length != 2){
004:       System.out.println(
             "usage:java RemoteTest hostName/ObjectID
              hostName/ObjectID");
005:       System.exit(1);
006:    }
007:    Test2_Proxy test1 = new Test2_Proxy("horb://"+argv[0]);
008:    Test2_Proxy test2 = new Test2_Proxy("horb://"+argv[1]);
009:    test1.setName("Test1");
010:    test2.setName("Test2");
011:    test1.print();
012:    test2.print();
013:  }
014:}
リスト3 RemoteTest.java

 では、リスト3を使って接続モデルを使ってみましょう。まずは、簡単なことから始めましょう。

■HORBサーバの起動

 以下のようにhorbに「start」起動オプションを与えます。このオプションに続けてリモートクラス名、オブジェクトID(名前)を付与します。この例では、リモートクラス名を「Test2」、オブジェクトIDを「testObj」としています。そうです、ここで指定したTest2クラスのインスタンスをtestObjという名前でHORBサーバ(horb)起動時に生成しているのです。これが、生成モデルの簡単な使い方の例です。起動後、以下のようにTest2のクラスがtestObjという名でスタートしたというメッセージが出れば成功です。

>horb -start Test2 testObj
Test2(testObj) started

■ Clientの起動

 RemoteTestは、起動引数を2つ必ず与えなければなりません。この引数には"接続するホスト名/接続するオブジェクトID"を与えてください。下記の例では、localhostのtestObjに2つの代理オブジェクトを接続しています。

>java RemoteTest localhost/testObj localhost/testObj

■実行結果

 実行するとHORBサーバ側のコマンドプロンプトに実行結果1のように出力されていると思います。実行結果をここでよくご覧になってください。第2回で説明した「HORBによるリモートオブジェクトのインスタンス管理」では実行結果2のようにそれぞれのリモートインスタンスが「Test1」、「Test2」と異なる名前を出力していましたね。ところが、今回の結果は、両方とも「Test2」と表示されています。この結果から、リモートオブジェクトのインスタンスとクライアントの代理オブジェクトとの対応関係が、お分かりになると思います。そうです、RemoteTest.javaで作成される2個の代理オブジェクトは、サーバ側に起動されているTest2クラスのインスタンス(名前testObj)に接続しているのです(図2参照)。

図2 接続モデル

 だから、クライアントからのsetName()呼び出しは、同じリモートオブジェクトに行われたわけです。

○実行結果1
> horb -start Test2 testObj
Test2(testObj) started

私の名前は Test2です。
私の名前は Test2です。

○実行結果2(第2回の「HORBによるリモートオブジェクトのインスタンス管理」)
>horb
私の名前は Test1です。
私の名前は Test2です。

■代理オブジェクトの引数

 ここで、もう一度、HORBコンパイル(horbc)で作成される代理オブジェクトの引数について整理しておきましょう。

new Test2_Proxy("horb://"+host+"/testObj");
         (A)   (B)   (C)


(A)プロトコル名
 HORBは、独自のORBプロトコルを追加する方法としてアドインORBプロトコル・アーキテクチャを提供しています。プロトコル名は、URL形式で記述します。入門者は、とりあえずここは「"horb://"」と記述してください。上級者を目指す人は、独自プロトコルを自作してください。この方法については近いうちに取り上げたいと思います。

(B)ホスト情報
 ホスト情報には、ホスト名、例えば「localhost」や[MyServer]などを指定できるほか、直接「127.0.0.1」といったIPアドレスを指定することができます。また、ホスト名の領域を使って、接続するサーバ側のポート番号を指定することができます。下記の例では、MyServerというホストの9000ポートに接続するということです。何も指定しない場合は、HORBはデフォルトポート(8887)を使っています。

Test2:9000

(C)オブジェクトID
 ホスト名の後にスラッシュ"/"で区切ってオブジェクトIDを指定します。この指定によって接続モデルになります。

(3) サーバアプリケーションを作る


Index

第4回 HORBでサーバアプリケーションを作ろう

  (1) 生成モデルって何だ?
(2) 接続モデルって何だ?
 HORBサーバの起動

 Clientの起動
 実行結果
 代理オブジェクトの引数
  (3)サーバアプリケーションを作る
 コンパイル
 Serverの起動
 Clientの起動
 実行結果
 

連載記事一覧



Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間