分散オブジェクト環境を学ぶ
連載:HORBと遊ぼう(5)
コンフィグレーションファイルで遊ぼう
萩本順三
HORB Openマネージャ
株式会社豆蔵
2001/6/15
(1)接続モデルのおさらい |
前回は、接続モデルについて紹介しましたがいかがでしたか。今回は、コンフィグレーションファイルを使って、接続モデルのさまざまな起動方法について説明します。その中で、HORBサーバのアーキテクチャについて少しだけ触れてみましょう。HORBサーバがどのように動作しているか?これを探るのも結構面白いですよ!
その前に、前回の接続モデルについて少しだけおさらいしておきましょう。接続モデルは、最初にサーバ側でリモートオブジェクトに名前を付けて起動しておき、クライアントから代理オブジェクト(Proxy)の生成(new)時に名前指定で、リモートオブジェクトに接続させることができるという機能でしたね。
また、接続モデルの起動方法として、コマンドラインから「(A)HORBサーバの起動オプションを使ってリモートオブジェクトを起動する方法」と「(B)サーバアプリケーションを使ってリモートオブジェクトを起動する方法」を紹介しました(このように接続モデルで立ち上げられたリモートオブジェクトのことをデーモンオブジェクトと呼びます)。
prompt1>horb -start Test2 testObj |
A
リモートオブジェクトを起動する方法 |
004: HORBServer hs = new HORBServer(9000);//
ポート番号9000番で立ち上げる |
B
サーバアプリケーションを使ってリモートオブジェクトを起動する方法 |
(A)の方法では、リモートオブジェクトが1つしか起動できません。また、(B)の方法では、プログラムにオンコーディングが必要となりますので融通が利きません。もう少し、HORBサーバに対する細かな設定をサーバアプリケーションから切り離した形で提供したいと思うこともあると思います。そのようなときに便利なのがHORBコンフィグレーションファイルです。今回は、コンフィグレーションファイルを使ってさまざまなHORBサーバの起動形態をご紹介していきましょう。今回の説明は、前回作成した以下のソースを使います。コンフィグレーションファイルを使用する場合は、サーバアプリケーションを用意する必要はありません。
リモートクラス | Test2.java(リスト1) |
クライアント | RemoteTest.java(リスト2) |
001:public class Test2{ |
リスト1 Test2.java |
001:public class RemoteTest{ |
リスト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 |
# |
コメント行 |
リスト3 testconf3.conf |
■起動してみよう
さっそくコンフィグレーションファイルを使ってHORBサーバを起動してみましょう。
●HORBサーバの起動
下記のようにhorbのconfオプションでコンフィグレーションファイルを指定します。コンフィグレーションファイルが正常に読み込めたなら、図1のようにデーモンオブジェクトがスタートされたとメッセージが出力されます。
prompt>horb -conf testconf1.conf |
図1 testconf1.confを使用したHORBサーバの立ち上げ |
●クライアントプログラムの起動
次のように起動します。前回も説明しましたが、ポート番号は、ホスト名の次に“:”で区切って指定します。その後に“/”で区切ってオブジェクト名を指定します。
prompt>java RemoteTest localhost:9000/testObj1
localhost:9000/testObj2 |
図2 クライアントの起動 |
うまくいったら、HORBサーバを起動した方に、リモートオブジェクトが出力した結果が表示されます(図3)。
prompt>horb -conf testconf1.conf |
図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 | |
(1)接続モデルのおさらい (2)コンフィグレーションファイルの使い方 起動してみよう 動作イメージClientの起動 |
|
(3)コンフィグレーションファイルを使ったさまざまな起動方法 起動してみよう 動作イメージ そのほかの設定情報 代理オブジェクトの引数 |
|
(4)HORB実験室「マルチクライアント・マルチスレッドからの利用」 コンパイル 動作イメージ マルチクライアントからの利用 動作イメージ |
|
連載記事一覧 |
- 実運用の障害対応時間比較に見る、ログ管理基盤の効果 (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に関する基礎知識を解説する。
|
|