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

連載:HORBと遊ぼう(2)

分散オブジェクトを体験しよう!

萩本順三
HORB Openマネージャ
株式会社豆蔵
2000/11/28

 (1) HORBが動作する仕組み

 前回使用していたサンプル・プログラムのリスト1リスト2は、クライアントからサーバ側にあるTestオブジェクトにリモートでメソッドの呼び出しを行っていました。今回は、このサンプルがどのようにして動いているのかについて詳しく説明していきます。

■HORBを使ったアプリケーションを動かす準備

 前回、リスト1リスト2をHORBで動作させるには、HORBのおまじないが必要ですと書きました。HORBのおまじないとは、HORBでコンパイルをすることです。HORB用のコンパイラはhorbcというコマンドになっています。ここで、前回登場したリスト1リスト2を再び眺めてみましょう。

public class Client2{ //クラス名の変更
  public static void main( String argv[] ){
    String host = (argv.length == 1) ? argv[0] : "localhost";
    Test_Proxy test = new Test_Proxy("horb://"+host);
    String result = test.greeting("こんにちは、Clientです。");
    System.out.println(result);
  }
}
リスト1 Client2.java

public class Test{
  public String greeting(String s){
    System.out.println(s);
    return "こんにちは、Testです。";
  }
}
リスト2 Test.java

 さて、コマンドラインからhorbcを実行して、リスト2のTest.javaをコンパイルしてください。さて、horbcは何をやっているのでしょうか? ちなみにコンパイル環境は前回に引き続いていますので、注意してください。

c:\examples\step1>horbc Test.java
      compiling Test.java
      generating Test_Proxy.java
      compiling Test_Proxy.java
      generating Test_Skeleton.java
      compiling Test_Skeleton.java

 実はhorbcは、内部でJavaコンパイラを起動してTest.javaをコンパイルした後、そのクラス・フォーマットを解析して、Test_Proxy.javaとTest_Skeleton.javaを生成しています。そして、その後2つのソースをJavacでコンパイルしているのです

 horbcを終えた後、Client2.javaをコンパイルすれば、HORBを使ったアプリケーションの動作準備は完了です。

c:\examples\step1>javac Client2.java

 horbcは、Javaソースだけではなく、クラスファイルを入力させることができます。例えば、すでにTest.classが作成されている場合は、ファイル拡張子を省いて次のように呼び出してください。

c:\examples\step1>horbc Test

 Test_Proxy、Test_Skeletonのソースが邪魔な場合は、「-delete」オプションを使うとソースを生成しません。でも、一度、どのようなソースが生成されているか見てみると面白いですよ!

c:\examples\step1>horbc -delete Test

 ちなみに、horbcの起動オプションは、「-?」オプションで確認することができます。

■ネットワーク環境で動かす準備

(1)クライアントとサーバへクラスを配置する

 クライアント側の実行したいフォルダ(ディレクトリ)に、Client2.classとTest_Proxy.classを配置します。また、サーバマシンに、Test_Skeleton.classとTest.classを配置してください。

(2)サーバマシンのホスト名を確認する

 ホスト名とは、hostsファイルやDNSに登録されているマシンの名前です。よく分からない場合は、ネットワーク管理者に聞いてみてください。ここでは、サーバの名前を「MyServer」という名前で説明を進めます。

 さて、ここまで説明した動作環境の設定ポイントを整理してみます。

クライアントに配置する
クラスファイル
Client2.class
Test_Proxy.class
サーバに配置する
クラスファイル
Test_Skeleton.class
Test.class
サーバのホスト名
MyServer


■さあ、実行してみよう!

 次の手順で実行してください。簡単でしょ!

(1)サーバ名(MyServer)でのHORBサーバの起動

 サーバマシン(MyServer)にて、DOSプロンプトを立ち上げ、HORBサーバを起動します。起動時に「horb -v」とすると、HORBサーバがどのようにメッセージを受け付けているかのログが見られます。

c:\examples\step1>horb
こんにちは、Clientです。

(2)クライアントからClient2を起動する

 前回と異なる点は、接続するホスト名を指定しているところです。

c:\examples\step1>java Client2 MyServer
こんにちは、Testです。


■頑張る黒衣たち

 HORBコンパイラ(horbc)で生成されるTest_Proxy.classという名のクラスは、代理オブジェクトと呼ばれ(オブジェクトリファレンスとも呼ばれます)、Testオブジェクトの代理役としてクライアント側で使われるクラスです。Test_Skeletonは、分散オブジェクト環境を実現するためにサーバ側に必要となるクラスです。

 これらのクラスは、分散オブジェクト環境の黒衣(くろご)のようなものです。黒衣は、ご存じの通り、歌舞伎の舞台で黒い衣装を着て、あたかもいないつもりで舞台を引き立てていますよね。HORBコンパイラの生成する「XXXX_Proxy.class」や「XXXX_Skeleton.class」は、分散オブジェクト環境を演出するために黒衣となって働くオブジェクトなのです。

 これによって、クライアントプログラムは、Test_ProxyオブジェクトをTestオブジェクトと思ってメッセージの呼び出しをやれるようになるのです。その際、黒衣たちは、メソッドの引数をサーバへ転送してTestオブジェクトのメソッドとして呼び出したり、Testオブジェクトのメソッドの戻り値をクライアントに返したり、といった作業をせっせとやってくれる働き者です。

 このように、Test_ProxyオブジェクトはTestオブジェクトの代理役として使えます。しかし、Test_Proxyオブジェクトは、Testオブジェクトに完全に成り代わるものではありません。Test_Proxyは、化けるのが下手なタヌキが人に化けたように、尻尾がしっかり見えているのです。例えば、Testオブジェクトにpublicな属性があったとしても、Test_Proxyにその属性を直接的にアクセスする手段が提供されるわけではありません。あくまで、TestオブジェクトのメソッドをTest_Proxyオブジェクトからリモート呼び出しできることをサービスとして提供しているのです。

図1 頑張る黒衣たち


■代理オブジェクトのコンストラクタ引数

 リスト1の4行目、代理オブジェクト(Test_Proxy)のコンストラクタの引数には、どのHORBサーバのどのクラスを生成するかという情報が含まれており、次のような意味があります。

Test_Proxy test = new Test_Proxy("horb://"+host);

プロトコル名 「"horb://"

 HORBは、独自のORBプロトコルを追加する方法としてアドインORBプロトコル・アーキテクチャを提供しています。プロトコル名は、URL形式で記述します。入門者は、とりあえずここは「"horb://"」と記述してください。上級者を目指す人は、独自プロトコルを自作してください。HORB Openでは、SOAPプロトコルをHORBに組み込む勇士を募集しています。

ホスト情報 「host

 ホスト情報には、ホスト名、例えば「localhost」や「MyServer」などを指定できるほか、直接「127.0.0.1」といったIPアドレスを指定することができます。そのほか、この領域に、ポートの指定やオブジェクトIDの設定ができますが、ここでは説明を割愛します。なお、「host」の前にある「+」は、ご存知の通り文字連結のための+演算子です。

■メッセージをやりとりするまでの流れ

 さて、ここで、HORBがどのようにして遠くにあるTestオブジェクトをリモート操作しているのか、その流れをシーンに分けて説明してみましょう。

●シナリオ1:Test_Proxyの作成(リスト1の4行目)

Test_Proxy test = new Test_Proxy("horb://"+host);


(1)Test_Proxyをnewすると、まず引数で渡されたMyServerへ接続します

(2)Test_Proxyをnewすると、サーバ側でTest_Skeletonがnewされて、その延長にて、Testオブジェクトがnewされます。両オブジェクトは、HORBサーバの管理下に置かれます

(3)Test_Proxyのnewが成功すると、生成されたTest_Proxyオブジェクトがtest変数に代入します


●シナリオ2:greetingメソッドのリモート呼び出し(リスト1の5行目)


String result = test.greeting("こんにちは、Clientです。");

(4)Client2からtest.greetingメソッドが呼び出され、Test_ProxyとTest_Skeletonを経由して、サーバに存在するTestオブジェクトのメソッドとして実行されます。このとき、引数のStringオブジェクトがネットワーク間を転送されます

(5)Testオブジェクトのメソッドの戻り値(String)が、Test_SkeletonとTest_Proxyを経由してネットワーク転送され、Clientに渡されます

 いかがでしたか? これは、リスト1(Client2)の4行目から始まり5行目で終わる小さな小さな物語なのです。

(2) HORBのインスタンス管理


Index
第2回 分散オブジェクトを体験しよう!
(1) HORBが動作する仕組み
 HORBを使ったアプリケーションを動かす準備
 ネットワーク環境で動かす準備
 さあ、実行してみよう!
 頑張る黒衣たち
 代理オブジェクトのコンストラクタ引数
 メッセージをやり取りするまでの流れ
  (2) HORBのインスタンス管理
 Javaのインスタンス管理
 HORBによるリモートオブジェクトのインスタンス管理
 


連載記事一覧



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

注目のテーマ

Java Agile 記事ランキング

本日 月間