分散オブジェクト環境を学ぶ
連載:HORBと遊ぼう(4)
HORBでサーバアプリケーションを作ろう
萩本順三
HORB Openマネージャ
株式会社豆蔵
2001/2/18
(2)接続モデルって何だ? |
すでに分散オブジェクト製品を使ったことがある方は、生成モデルの使いやすさを実感されたと思います。生成モデルは、ほかの分散オブジェクト製品にはない良さを持っています。ほかの分散オブジェクト技術では、代理オブジェクト1つにリモートオブジェクト1つを割り付けるにはサーバプログラムでちょっとした工夫が必要となるので、生成モデルのように簡単ではありません(注1)。このように、生成モデルは、非常にJava言語にシームレスな分散オブジェクト環境を提供します。でも、生成モデルの使いやすさの半面、何かが足りないと思った方も多いのではないでしょうか。そうです、生成モデルにも欠点があるのです。
生成モデルの場合、クライアント側から代理オブジェクト(Proxy)が生成(new)されるときにサーバ側でリモートオブジェクトが生成(new)されます。よって、サーバ側で2、3個のリモートオブジェクトを立ち上げてクライアントからサービスするといったようなケースでは、生成モデルは不向きなのです。なぜなら代理オブジェクトが1000個できるとそれに対応するリモートオブジェクトが1000個できるからです。
また、稼働中のサーバアプリケーションがすでに何らかのサービスを提供していたとします。そのサーバアプリケーションにクライアントから接続して、サービスを受けるようにしたい場合、生成モデルではすでに稼働中のサーバアプリケーションのサービスを受けることができにくいのです。なぜなら、生成モデルの場合は、あくまでクライアントから代理オブジェクトの生成(new)が行われたときに、サーバ側でHORBサーバによって自動的に生成(new)されるのです。よってすでにサービスを提供中のほかのオブジェクトが自動的に生成されたリモートオブジェクトを認識(参照)する術がないのです(注2)
。
さて、このようなときはどう対処すればよいと思いますか? やりたいことは、すでに稼働中のサーバアプリケーションのサービスをクライアントから受けることです。これをもっと簡潔にいうと、「すでに稼働中のオブジェクトのサービスをクライアントから受ける」ことです。
前置きが長くなりましたが、このようなソリューションには、HORBの接続モデルが適しています。接続モデルは、最初にサーバ側でリモートオブジェクトに名前を付けて起動しておいて、クライアントから代理オブジェクト(Proxy)の生成(new)時に名前指定で、リモートオブジェクトに接続させることができるという機能です。
リスト3を見てください。このソースは、リスト2のRemoteInstanceTest.javaのホスト名を指定する部分をプログラム起動引数から与えるように変更しています(7行目と8行目)。この部分でホスト名の後にオブジェクトIDを指定すると接続モデルとなり、すでに起動されているリモートオブジェクトへの接続が可能となります。
001:public class RemoteTest{ |
リスト3 RemoteTest.java
|
では、リスト3を使って接続モデルを使ってみましょう。まずは、簡単なことから始めましょう。
■HORBサーバの起動
以下のようにhorbに「start」起動オプションを与えます。このオプションに続けてリモートクラス名、オブジェクトID(名前)を付与します。この例では、リモートクラス名を「Test2」、オブジェクトIDを「testObj」としています。そうです、ここで指定したTest2クラスのインスタンスをtestObjという名前でHORBサーバ(horb)起動時に生成しているのです。これが、生成モデルの簡単な使い方の例です。起動後、以下のようにTest2のクラスがtestObjという名でスタートしたというメッセージが出れば成功です。
> horb
-start Test2 testObjTest2(testObj) started |
■ Clientの起動
RemoteTestは、起動引数を2つ必ず与えなければなりません。この引数には"接続するホスト名/接続するオブジェクトID"を与えてください。下記の例では、localhostのtestObjに2つの代理オブジェクトを接続しています。
>java RemoteTest localhost/testObj localhost/testObj |
■実行結果
実行するとHORBサーバ側のコマンドプロンプトに実行結果1のように出力されていると思います。実行結果をここでよくご覧になってください。第2回で説明した「HORBによるリモートオブジェクトのインスタンス管理」では実行結果2のようにそれぞれのリモートインスタンスが「Test1」、「Test2」と異なる名前を出力していましたね。ところが、今回の結果は、両方とも「Test2」と表示されています。この結果から、リモートオブジェクトのインスタンスとクライアントの代理オブジェクトとの対応関係が、お分かりになると思います。そうです、RemoteTest.javaで作成される2個の代理オブジェクトは、サーバ側に起動されているTest2クラスのインスタンス(名前testObj)に接続しているのです(図2参照)。
図2 接続モデル |
だから、クライアントからのsetName()呼び出しは、同じリモートオブジェクトに行われたわけです。
○実行結果1 > horb
-start Test2 testObj |
○実行結果2(第2回の「HORBによるリモートオブジェクトのインスタンス管理」)
>horb |
■代理オブジェクトの引数
ここで、もう一度、HORBコンパイル(horbc)で作成される代理オブジェクトの引数について整理しておきましょう。
new Test2_Proxy("horb://"+host+"/testObj");
|
(A)プロトコル名
HORBは、独自のORBプロトコルを追加する方法としてアドインORBプロトコル・アーキテクチャを提供しています。プロトコル名は、URL形式で記述します。入門者は、とりあえずここは「"horb://"」と記述してください。上級者を目指す人は、独自プロトコルを自作してください。この方法については近いうちに取り上げたいと思います。
(B)ホスト情報
ホスト情報には、ホスト名、例えば「localhost」や[MyServer]などを指定できるほか、直接「127.0.0.1」といったIPアドレスを指定することができます。また、ホスト名の領域を使って、接続するサーバ側のポート番号を指定することができます。下記の例では、MyServerというホストの9000ポートに接続するということです。何も指定しない場合は、HORBはデフォルトポート(8887)を使っています。
Test2:9000 |
(C)オブジェクトID
ホスト名の後にスラッシュ"/"で区切ってオブジェクトIDを指定します。この指定によって接続モデルになります。
(3) サーバアプリケーションを作る |
Index | |
(1) 生成モデルって何だ? | |
(2) 接続モデルって何だ? HORBサーバの起動 Clientの起動 実行結果 代理オブジェクトの引数 |
|
(3)サーバアプリケーションを作る コンパイル Serverの起動 Clientの起動 実行結果 |
|
連載記事一覧 |
- 実運用の障害対応時間比較に見る、ログ管理基盤の効果 (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に関する基礎知識を解説する。
|
|