分散オブジェクト環境を学ぶ
連載:HORBと遊ぼう(5)

コンフィグレーションファイルで遊ぼう

 

(4)HORB実験室
   「マルチクライアント・マルチスレッドからの利用」

 ここまでは、単純な1クライアントからのリモートオブジェクトの利用を想定して説明をしてきました。ここでは、マルチクライアントからマルチスレッドで使われる際に、HORBサーバがどのように送受信するのかを見ていきましょう。ここはちょっと難しいかもしれませんよ。理解できそうもないときはあっさり読み飛ばしてください。

 まず、Test2クラスに長い処理を行うためのメソッド「longJob」を追加したクラスをTest3.javaとして作成します。このクラスのlongJobメソッドは、メソッドの入り口で出力し、4秒間スリープし、メソッドの出口で出力するだけのものです。

 クライアントはRemoteTest2(リスト6)を使います。このクラスは、2つのスレッドを作成し、作成したスレッドのrunメソッドの中でTest3の代理オブジェクトを作成します。そして、永久ループでlongJobメソッドを呼び出すものです。

 コンフィグレーションファイルは、リスト7を使います。この一連のネットワークプログラムはどのように動くか想像できますか? それは後でじっくりと説明します。まずはコンパイルして実行してみましょう。

001:public class Test3{
002:   private String name;
003:   public void setName(String name){
004:     this.name = name;
005:   }
006:   public void print(){
007:     System.out.println("私の名前は "+name+ "です。");
008:   }
009:   public void longJob(String s){
010:     System.out.println("処理名[ "+s+" ] 開始");
011:     try{ Thread.sleep(4000); }catch(Exception e){}
012:     System.out.println("処理名[ "+s+" ] 終了");
013:   }
014:}
リスト5 Test3.java

001:public class RemoteTest2{
002:   public static void main( String argv[] ){
003:     if(argv.length != 2){
004: System.out.println(
005:     "usage:java RemoteTest hostName/ObjectID hostName/ObjectID");
006:     System.exit(1);
007:   }
008:   new TestThread(new Test3_Proxy("horb://"+argv[0]),"test1の").start();
009:   new TestThread(new Test3_Proxy("horb://"+argv[1]),"test2の").start();
010:   }
011:}
012:class TestThread extends Thread{
013:   Test3_Proxy proxy;
014:   String name;
015:   TestThread(Test3_Proxy proxy,String name){
016:     this.proxy = proxy;
017:     this.name = name;
018:   }
019:   public void run(){
020:     int count=1;
021:     proxy.setName(name);
022:     while(true){
023:       proxy.longJob(name+count++);
024:       try{
025:        sleep(3000);
026:       }catch(Exception e){}
027:     }
028:   }
029:}
リスト6 RemoteTest2.java

記述 説明
01
02
03
04
05
06
07
08
09
10
11
12
13
14
#
# HORB Servers
#
horbServer[0].name=HORBServer1(9000)
horbServer[0].port=9000
#
# auto start objects
#
object[0].className=Test3
object[0].objectID=testObj1

object[1].className=Test3
object[1].objectID=testObj2

コメント行
  
  
HORBサーバの名前
HORBサーバのポート番号


(1個目のデーモンオブジェクト)
リモートオブジェクトのクラス名
リモートオブジェクトの名前
(2個目のデーモンオブジェクト)
リモートオブジェクトのクラス名
リモートオブジェクトの名前

リスト7 testconf4.conf

■コンパイル

prompt>horbc -delete Test3.java
    compiling Test3.java
    generating Test3_Proxy.java
Warning: Test3: private variable 'name' will not be copied when this object is t
    ransfered by Proxy.
    compiling Test3_Proxy.java
    generating Test3_Skeleton.java
    compiling Test3_Skeleton.java
prompt>java RemoteTest2.java
図11 ソースのコンパイル

■HORBサーバの起動

prompt>horb -conf testconf4.conf
Test2(testObj1) started
Test2(testObj2) started
図12 testconf4.confを使用したHORBサーバの立ち上げ

prompt>java RemoteTest2 localhost:9000/testObj1 localhost:9000/testObj2
図13 クライアントの立ち上げ

 実行結果から、起動された2つのスレッドが、HORBサーバから起動された2つのデーモンオブジェクトのメソッドを並行に呼び出していることが分かります。

prompt>horb -conf testconf4.conf
処理名[ test1の1 ] 開始
処理名[ test2の1 ] 開始
処理名[ test1の1 ] 終了
処理名[ test2の1 ] 終了
処理名[ test1の2 ] 開始
処理名[ test2の2 ] 開始
処理名[ test1の2 ] 終了
処理名[ test2の2 ] 終了
図14 HORBサーバの実行結果

■動作イメージ

 動作イメージは図4のとおりです。このイメージは、2つのスレッドがそれぞれのオブジェクトのlongJobメッセージを同時に送っているその瞬間をとらえたものです。この図のように、クライアント(JVM)がマルチスレッドで動作し、代理オブジェクトに並行呼び出しをかける場合は、それぞれの呼び出しにRequestServer(& 受信用ソケット)が対応します。その後、どちらかのメソッド呼び出しが完了すると、対応していたRequestServerは、ほかのメッセージ処理に再利用されるのです。

 どうですか、動作イメージはつかめましたでしょうか?

図15 クライアントからのマルチスレッド呼び出し時の動作イメージ


■マルチクライアントからの利用


 次はマルチクライアントからの利用を実行してみましょう。まず、先ほどの手順で、サーバとクライアントを起動してください。その後、別のコマンドプロンプトを開いて、もう1つクライアントプログラムを起動してください。

prompt>java RemoteTest2 localhost:9000/testObj1 localhost:9000/testObj2
図16 もう1つのクライアントを起動する

 HORBサーバ側では、新たに起動したクライアントプログラムの出力結果が、すでに起動されているクライアントプログラムの出力結果と混在した形で表示されます。

処理名[ test1の1 ] 終了
処理名[ test2の1 ] 終了
処理名[ test2の186 ] 終了
処理名[ test1の186 ] 終了
処理名[ test1の2 ] 開始
処理名[ test2の2 ] 開始
処理名[ test2の187 ] 開始
処理名[ test1の187 ] 開始
処理名[ test1の2 ] 終了
処理名[ test2の2 ] 終了
処理名[ test2の187 ] 終了
処理名[ test1の187 ] 終了
処理名[ test1の3 ] 開始
処理名[ test2の3 ] 開始
処理名[ test2の188 ] 開始
処理名[ test1の188 ] 開始
図17 HORBサーバの実行結果

■動作イメージ

 複数のクライアントからマルチスレッド環境で同時にメソッドを呼び出すと、それぞれのクライアント(JVM)の並行呼び出しの多重度ごとにRequestServerが割り当てられます。また並行的な呼び出しが終わった時点で、クライアントごとにSocketは一定期間プールされ、再度並行呼び出しがある際に再利用されています。また、RequestServerを実行するスレッドは、プロセスの単位で一定量プールされ複数のクライアントからの要求時に再利用されます(このスレッドプールはHORB ver2.1からサポートされています)。

図18 マルチクライアントからのマルチスレッド呼び出し時の動作イメージ

 このようにHORBは、OSのソケットやスレッドといったコストのかかる資源を大切にしつつ、最大のパフォーマンスを出せるよう設計がなされています。

 いかがでしたか。今回は、コンフィグレーションファイルを使ってHORBサーバの起動形態を説明しながら、HORBサーバのアーキテクチャについても説明しました。


 


Index

第5回 コンフィグレーションファイルで遊ぼう

  (1)接続モデルのおさらい
(2)コンフィグレーションファイルの使い方
 起動してみよう

 動作イメージClientの起動
  (3)コンフィグレーションファイルを使ったさまざまな起動方法
 起動してみよう

 動作イメージ
 そのほかの設定情報
 代理オブジェクトの引数
(4)HORB実験室「マルチクライアント・マルチスレッドからの利用」
 コンパイル
 動作イメージ
 マルチクライアントからの利用
 動作イメージ
 

 

連載記事一覧



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

注目のテーマ

Java Agile 記事ランキング

本日 月間