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

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

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

(1)接続モデルのおさらい

 前回は、接続モデルについて紹介しましたがいかがでしたか。今回は、コンフィグレーションファイルを使って、接続モデルのさまざまな起動方法について説明します。その中で、HORBサーバのアーキテクチャについて少しだけ触れてみましょう。HORBサーバがどのように動作しているか?これを探るのも結構面白いですよ!

 その前に、前回の接続モデルについて少しだけおさらいしておきましょう。接続モデルは、最初にサーバ側でリモートオブジェクトに名前を付けて起動しておき、クライアントから代理オブジェクト(Proxy)の生成(new)時に名前指定で、リモートオブジェクトに接続させることができるという機能でしたね。

 また、接続モデルの起動方法として、コマンドラインから「(A)HORBサーバの起動オプションを使ってリモートオブジェクトを起動する方法」「(B)サーバアプリケーションを使ってリモートオブジェクトを起動する方法」を紹介しました(このように接続モデルで立ち上げられたリモートオブジェクトのことをデーモンオブジェクトと呼びます)。

prompt1>horb -start Test2 testObj
Test2(testObj) started
A リモートオブジェクトを起動する方法

004: HORBServer hs = new HORBServer(9000);// ポート番号9000番で立ち上げる
005: Test2 test1 = new Test2();
006: Test2 test2 = new Test2();
007: HORBServer.registerObject("Test2", test1, "testObj1");
008: HORBServer.registerObject("Test2", test2, "testObj2");
B サーバアプリケーションを使ってリモートオブジェクトを起動する方法

 (A)の方法では、リモートオブジェクトが1つしか起動できません。また、(B)の方法では、プログラムにオンコーディングが必要となりますので融通が利きません。もう少し、HORBサーバに対する細かな設定をサーバアプリケーションから切り離した形で提供したいと思うこともあると思います。そのようなときに便利なのがHORBコンフィグレーションファイルです。今回は、コンフィグレーションファイルを使ってさまざまなHORBサーバの起動形態をご紹介していきましょう。今回の説明は、前回作成した以下のソースを使います。コンフィグレーションファイルを使用する場合は、サーバアプリケーションを用意する必要はありません。

リモートクラス Test2.java(リスト1)
クライアント RemoteTest.java(リスト2)

001:public class Test2{
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:}
リスト1 Test2.java

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:}

リスト2 RemoteTest.java

(2)コンフィグレーションファイルの使い方

 まず、コンフィグレーションファイルを使って、2つのHORBサーバスレッドを立ち上げる例を紹介します。リスト3は、コンフィグレーションファイルの記述例です。この例は、先に挙げた「(B)サーバアプリケーションを使ってリモートオブジェクトを起動する方法」と同じ結果となります。コンフィグレーションファイルの記述は、慣れるまで結構面倒なもので、嫌だなあと思われる方も多いでしょう。いまのところは我慢してお付き合いください。もうすぐリリースされるHORB ver2.1では、コンフィグレーション作成ツールがリリースされます(今回のプログラムファイルはここからダウンロードしてください)。

 コンフィグレーションファイルの記述内容を簡単に説明します。コメントは「#」を1けた目に書きます。1けた目でないとエラーとなります。

● 「horbServer」キーワード
 HORBサーバに対する起動パラメータを指定します。HORBサーバを複数立ち上げる場合は、javaの配列(例horbServer[0]、horbServer[1])のように指定します。4行目のnameはHORBサーバの名前を記述、5行目のportは起動されるポートの指定をしています。ポートの前後にスペースを入れるとエラーになるので気を付けてください。

● 「object」キーワード

  デーモンオブジェクトに対する指定です。「horbServer」キーワードと同様に配列を使ってN個のデーモンオブジェクトを設定できます。9行目のclassNameは、リモートクラスのクラス名です。クラス名はパッケージ名も含みます。10行目のobjectIDはリモートオブジェクトの名前を指定しています。ここでは、“testObj1”が指定されています。12行目からは、もう1つのリモートオブジェクト“testObj2”を指定しています。

記述 説明
01
02
03
04


05
06
07
08
09
10
11
12
13
#
# HORB Servers
#
horbServer[0].name=HORBServer1
(9000)

horbServer[0].port=9000
#
# auto start objects
#
object[0].className=Test2
object[0].objectID=testObj1

object[1].className=Test2
object[1].objectID=testObj2
コメント行
    
    
HORBサーバの名前


HORBサーバのポート番号
 
 
(1個目のデーモンオブジェクト)
リモートオブジェクトのクラス名
リモートオブジェクトの名前
(2個目のデーモンオブジェクト)
リモートオブジェクトのクラス名
リモートオブジェクトの名前
リスト3 testconf3.conf

■起動してみよう

 さっそくコンフィグレーションファイルを使ってHORBサーバを起動してみましょう。

●HORBサーバの起動

 下記のようにhorbのconfオプションでコンフィグレーションファイルを指定します。コンフィグレーションファイルが正常に読み込めたなら、図1のようにデーモンオブジェクトがスタートされたとメッセージが出力されます。

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

●クライアントプログラムの起動
 次のように起動します。前回も説明しましたが、ポート番号は、ホスト名の次に“:”で区切って指定します。その後に“/”で区切ってオブジェクト名を指定します。

prompt>java RemoteTest localhost:9000/testObj1 localhost:9000/testObj2
図2 クライアントの起動

 うまくいったら、HORBサーバを起動した方に、リモートオブジェクトが出力した結果が表示されます(図3)

prompt>horb -conf testconf1.conf
Test2(testObj1) started
Test2(testObj2) started
私の名前は Test1です。
私の名前は Test2です。
図3 HORBサーバの実行結果

■動作イメージ

 まず、コマンドプロンプトからHORBを起動するとコンフィグレーションファイルを読み込み、「horbServer」キーワードの情報から9000番ポートで接続を待つHORBServerクラスのインスタンスが作成されます。また、「object」キーワードの情報を読み込み、「testObj1」と「testObj2」の名前でTest2クラスの2つのインスタンスを生成し、HORBServerのオブジェクトテーブルに登録します。

 クライアントからnew Test2_Proxy()が実行されると、HORBServerはRequestServerクラスのインスタンスを生成します。HORBServerは、9000番ポートから2つのリモートオブジェクトに対するメッセージを待つスレッドとして動作します

 ここで注意してほしいのは、複数の代理オブジェクトを介したメッセージ処理を、1個のRequestServer(Thread)で実行していることです。

図4 動作イメージ

用語説明
■プロセス

 プロセスとは資源を共有する単位です。例えばプロセスにはOSからアクセス可能なメモリが割り当てられます。Java(JVM)を起動するとJavaに割り当てられたプロセスの中でJavaアプリケーションが動きます。
■スレッド
 スレッドは、プログラムを並行に動作可能な単位のことです。スレッドは、Javaの動くマルチタスクOSの力を借りて、ランドロビン方式によって、交互にCPUの使用権を得ながら仕事をします。よって、人の感覚では同時に動作しているように見えるのです。同じプロセスから作られたスレッドは、プロセスの資源を共有できます。例えば、メモリは共有されます。
 スレッドを実現するJavaのクラスは、ご存じjava.lang.Thread.classです。プロセスには1つ以上のスレッドが存在します。HORBServerとRequestServerは別スレッドですので、クライアントからの接続要求待ちと、クライアントからのメッセージ呼び出しは並行処理されています。
■ソケット
 ソケット通信を実現するクラスとしてjava.net. ServerSocket.classとjava.net. Socket.classがあります。HORBもデフォルトのトランスポートプロトコルとしてこの2つのクラスを使っています。プラグインプロトコルを使えば、これらのクラスを変更することもできます。
 ServerSocketは、クライアントからの接続要求を待つacceptメソッドを持ちます。acceptメソッドの呼び出しは、クライアントからの接続要求(new Socket)があるとリターンされ、戻り値としてSocketインスタンスを生成します。Socketインスタンスを持つのがRequestServerです。RequestServerインスタンスは、スレッドとして生成され、Socketを使って、クライアントからのリモートオブジェクトに対する要求を待っています。


  (3)コンフィグレーションファイルを使ったさまざまな起動方法


Index

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

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

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

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

 

連載記事一覧



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

注目のテーマ

Java Agile 記事ランキング

本日 月間