PR

用途と性格がかなり違う

図4●OLEの構成
OLE(Object Linking and Embedding)はもともと複合文書を実現するために開発されたものである。このため,当初OLEはユーザー・インタフェースを備えているものが当然だった。また文書が切り替わって編集できればよいので,メソッドを呼び出す機能もなかった。ここにOLE Automationというインタフェースが加わり,アプリケーション間連携機能に発展した。さらにコンポーネントを実現するために,呼び出した先(サーバー側)からイベントを通知するインタフェースを追加した。ActiveXコントロールを実装するにあたり,これらすべてを満たす必要はない。

 実のところJavaBeansとActiveXコントロールは,同じコンポーネントの規約といっても性格がかなり違うものになっている。

 まずActiveXコントロールは,元々が複合文書を実現するための機構だった。これにサーバー・アプリケーションを呼び出すためのインタフェースである「OLE Automation」や,コンポーネントのための規約「OLE Control」などを追加して成り立っている(図4[拡大表示])。その中心に位置するのがCOMである。OLEを含む全体の体系としてみると,コンポーネントのためには不要なものが多々ある。例えばドラッグ・アンド・ドロップなど,ユーザー・インタフェースを持たないコンポーネントには関係がない機能である。

 また,特定のプログラミング言語に依存しないため,呼び出しのインタフェースは最終的にポインタを渡すようになっている。実際のプログラム上はここを意識する必要はないが,実体はC++におけるメソッドのポインタ(呼び出しアドレス)を格納したテーブル(vtableと呼ぶ)である。OLEサーバーを当初Visual C++でしか開発できなかった理由はここにある。C++であれば呼び出されるメソッドのアドレスを記述するテーブルは自動的に作られる。多義的に(polymorphic)に振る舞うために必要だからだ。これに対しVisual Basicでは,インタプリタ本体がメソッドのアドレスを管理するので,vtableに相当するものは存在しない。コンポーネント作成用に別途生成しなければならなかった。

 一方JavaBeansは,その名称からも明らかなようにJavaに特化したコンポーネントである。したがって,ActiveXコントロールのようなvtableは不要で,Javaのメソッド呼び出しの仕組みさえあればよいことになる。またJavaBeansはあくまでもソフトウェア部品の規約であるため,ユーザー・インタフェース関連の機能は特に定めていない。この点については,Javaが備えるほかのさまざまなサービス・ライブラリを利用して実現することになる。ここもJavaに特化しているゆえに実現できる点である。

図5●EJB(Enterprise JavaBeans)の動作モデル
Enterprise JavaBeansの場合,クライアントとなるプログラムとコンポーネントそのものは直接通信しない。間にコンポーネントを管理するHomeオブジェクトと,インタフェース役を果たすEJB Objectが介在する。このような形態を採ることにより,コンポーネントを格納するコンテナがトランザクション処理を実施したり,負荷分散したりできるようになっている。

 むしろJavaのソフトウェア部品の規約というと,サーバー・アプリケーション用に特化した「Enterprise JavaBeans」の方が今では重要かもしれない。EJBは唯一のサーバー用コンポーネントの規約だからだ。最近では多くのWebアプリケーションがEJBを使って実装されている。

 EJBの特徴は,サーバー・アプリケーションを想定している点だ。クライアントはまず「Homeオブジェクト」に対してソフトウェア部品(EJBではEnterprise Beanと呼ぶ)の生成を依頼する(オブジェクトの実体化)。だがクライアントは直接Enterprise Bean本体とやり取りするのではなく,呼び出し用のオブジェクト(EJB Object)を介して処理を依頼する(図5[拡大表示])。このような複雑な構造を採ったのは,スケーラビリティ向上のためである。まずBean本体とEJB Objectを別のマシンで実行できる。また複数のサーバーにBean本体を配置させて,負荷分散をさせることも可能だ。

 EJBを管理するソフトをコンテナと呼ぶ。WebLogicやWebShpereなど,いわゆるJavaアプリケーション・サーバー製品の主要な役割の一つである。EJB HomeやEJB Objectに対するリクエストは,JavaにおけるRPCに相当するRMI(Remote Method Invocation)を使う。これらはインターネットを介して呼び出すことはできない。Webブラウザから直接アプリケーション・サーバーを呼び出すわけではない。Webサーバーで動くServletなどのJavaプログラムから呼び出すことになる。Java2 Enterprise Edition(J2EE)は,EJBだけでなくServlet,JavaServer Pagesなど,企業システムに必要とされるほかのAPI群も含んでいる。

「コンポーネントが再利用の道を開いたってことですね」
「ソースコードをひもといて,関連するクラスをすべて道連れにするのって結構たいへんなんだよね。参照関係が複雑だから。結局全部取り出しちゃうんじゃ,あまり価値がないし。それに,名前の衝突とかも発生しやすいし」
「でも,ますます自分でも使いやすいコンポーネントを作りたくなっちゃったな」
「そのためには経験を積むのが一番だね」

(北郷 達郎、八木 玲子)