
分散オブジェクト環境を学ぶ
連載: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{ //クラス名の変更 |
リスト1 Client2.java
|
public class Test{ |
リスト2 Test.java
|
さて、コマンドラインからhorbcを実行して、リスト2のTest.javaをコンパイルしてください。さて、horbcは何をやっているのでしょうか? ちなみにコンパイル環境は前回に引き続いていますので、注意してください。
c:\examples\step1>horbc Test.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 |
(2)クライアントからClient2を起動する
前回と異なる点は、接続するホスト名を指定しているところです。
c:\examples\step1>java
Client2 MyServer |
■頑張る黒衣たち
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によるリモートオブジェクトのインスタンス管理 |
|
![]() |
連載記事一覧 |
- 実運用の障害対応時間比較に見る、ログ管理基盤の効果 (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に関する基礎知識を解説する。
![]() |
|
|
|
![]() |