レベル: 初級 万仲龍樹・中山清喬・杉田直哉・津田嘉孝, 日本アイ・ビー・エム システムズエンジニアリング株式会社
2007年 5月 25日 J2EEアプリケーションサーバ「Apache Geronimo」の魅力に迫ってきた本連載も、いよいよ今回で最終回となります。今回は、RoGの実現を通して、GBeanの原理をより深く理解してください。
RoGを動かす
本連載の第3回から第4回で解説した知識が補強できたところで、実際に手を動かし、挙動を確かめてみましょう。環境構築に関しては本連載の第1回から第2回のほか、サンプルファイルに添付したreadme.txtを参考にしてください。
準備ができたら、geronimo-startup.batを使ってGeronimoを起動してください。DLLを利用しているので、このバッチを利用します。そして、サンプルをrubyGBean.plan、helloGBean.plan、sample.entarprize.earの順にデプロイします。
RoGの実行確認
http://localhost:8080/sample.web/HelloServlet
にアクセスし、テキストボックスに「山田たろ~」と入力してみましょう。「Result: Hello!! 山田たろ~」となれば、アクセス成功です(図1)。
図1. HelloServlet
サンプルの動作原理を触って理解しよう
図2に示したように2つのコンフィギュアとEARとは依存関係があります。「configure/helloGBean」をstopするとどうなるか、またsample.enterprize/sample.enterprizeをstartしようとするとどうなるか、試してみましょう(図3)。依存関係に従って動作していることがお分かりいただけるかと思います。さらに余力があれば、開発環境を構築し*、geronimo-applicatino.xml/geronimo-web.xmlからparentIDを削除して、再度sample.enterprize.earをデプロイしてみましょう。その挙動の違いも分かると思います(図4)。
図2 クラスローダーの関係
拡大図
円盤はクラスローダー、球はオブジェクト、グレーの実線はクラスの参照経路、点線の矢印はコラボレーション関係、黒の実線は依存関係を表します。そして、1と2の経路では、得られるHelloクラスは別のものになります。そのため、1の経路でロードしなければ、ClassCastExceptionが発生します。つまり、sample/helloGBeanをparentIDに指定する必要があります。
図3 依存関係の検証
拡大図
図4 parentIDを削除する実験。500エラーが発生し、ClassCastExceptionが起きている
拡大図
この挙動の違いが現れるのは、コンフィギュアとクラスローダー*が対応しているためです。この仕組みによってGBean同士の実装が互いに影響しないようになります。特にアプリケーション間で共通に使用するJARのバージョンに違いがある場合などでその真価を発揮します。ちなみにconfigure/rubyGBeanを登録する際にJARファイルの登録はしませんでした。その訳はgeronimo-startup.batで<GERONIMO_HOME>\repositoryディレクトリ配下にJARファイルをコピー*していたことにあります。このようなrepositoryにあるJARファイルを利用したGBeanの登録も可能です。この部分は、同じApacheプロジェクトであるMaven*プロジェクトの成果を享受しています。
RoGを実現してみて
以上で、とりあえず、RoGの実現を通して、GBeanの原理をより深く理解いただけたと思います。しかし、RoGを実際に構築した方なら、rubyGBeanをstopして再度startしようとしてエラーの発生を経験していると思います。この不具合を残していることが心残りです(エラーの原因はクラスローダーの仕組みにあります)。
RoGでエラーを回避する手段をわたしは模索中ですが、1つにはそもそも管理対象がJava以外ということがあります。これは多言語連携のリスクだととらえる必要性を示しています。本当に組み込み系などで利用したいのであれば、専用のGeronimoプロセスを立てる必要も出てきます。しかし、一度Geronimoの上で動作するようになれば、それはJ2EEがサポートする強力なリソース管理やセキュリティ管理手段を手に入れたも同然です。GBeanがJMXを拡張していることを考え合わせれば、プロセスを越えるどころか、マシンを越えてRMI*やSOAP*を通じた管理も可能になります。また、Geronimoのアーキテクチャーはマイクロカーネル方式です。不要なGBeanは簡単に外せ、リソースの節約もできます。
わたしがこの記事を書いた一番の動機は、読者の皆さんにGeronimo活用法の発想を豊かにしていただきたいと思ったことです。皆さまもGeronimoに触れ、ぜひ、その秘められた可能性を広げていってください。
コラム:組み込み系機器の管理もGeronimoで
4年程前、わたしは筐体にたくさんデバイスが取り付けられている組み込み系機器のプロジェクトにJavaのサポートで参加しました。その機器はさまざまなメーカーが製品をそろえており、その上にお客様のアプリケーションが製品ごとにカスタマイズされて載っていました。そのミドルウェアではデバイスサービスの起動/停止やアプリケーションからの要求をデバイスサービスに委譲するなど、いま思えば、まさにGeronimoカーネルが担当している部分でした。
ほかの組み込み系機器でも同じ手法が使えないか? と思っているところへGeronimoが登場しました。これは簡単になる! と直感が働きました。だからこそサンプルであっても、「入出力中は終了処理を遅延させ、また、終了状態に入ったらもう以降の処理を受け付けない」コードや今回のRubyがそうであるように「マルチスレッドに非対応のコードを保護する」コードなど、マルチスレッドに関するコードをふんだんに盛り込んでおり、実践的なサンプルとしました。
日本のメーカーは、組み込み系技術に卓越しています。もし、Geronimoの上で組み込み系機器を管理することが実現したら、それはJ2EEというオープンな技術の上で戦える武器を持ったことになります。実際に読者の中から組み込み系の管理にGeronimo採用を決断する方が現れ、その強力な機能を十分活用していただけたなら、わたしにとって望外の成果です。
このページで出てきた専門用語
-
開発環境を構築し
- 開発環境の構築手順についても、サンプルファイル内のreadme.txtを参照してください。
-
コンフィギュアとクラスローダー
- これも現在調査中ですが、わたしはコンフィギュアとクラスローダーは1対1に対応付くと考えていました。しかし、GBeanの構成ファイルから<dependency>タグを削除するなどのテストを行った結果、いずれもエラーが発生していたので、必ずしもそうではないようです。また、configure/rubyGBeanを再度startした際に、既にDLLが別のクラスローダーによってロードされているとのエラーが発生している理由は、はじめに起動したconfigure/rubyGBean用のクラスローダーでDLLをロードしているためです。しかしstopしても、クラスローダーは削除されますが、DLLは残ったままとなっています。その結果、エラーが発生してしまいます。
-
repositoryディレクトリ配下にJARファイルをコピー
- 簡単には、repository配下にjarをコピーすればGeronimoはその存在を認識します。このほかにも、コンソールからデプロイが可能です。 Project Object Modelと呼ばれる単位でプロジェクトをモデル化し、成果物の管理を行うツールです。GeronimoでもMavenの手法が取り入れられているので、Eclipseでの開発からサーバ環境までをファイルレベルでシームレスにつなげられるのではないか、とわたしは期待しています。
-
RMI
- Remote Method Invocationの略。別のホストにあるJavaオブジェクトのメソッドを呼び出すための通信手段です。
-
SOAP
- Simple Object Access Protocolの略。オブジェクト間の通信をXMLベースの記述で行うプロトコル仕様です。
参考文献
著者について  | |  | 万仲龍樹・中山清喬・杉田直哉・津田嘉孝
日本アイ・ビー・エム システムズエンジニアリング株式会社
日本アイ・ビー・エム システムズ・エンジニアリング株式会社(ISE)は、日本アイ・ビー・エムグループにおけるSE技術者の専門家集団として1992年7月に設立されました。発足以来、IBM製品を中心とした難易度の高い複雑なシステム構築や先進技術の適用場面において、卓越したITスキルによりお客様と開発現場を支援してきました。近年は、仮想化技術・グリッドコンピューティング・Web 2.0・オープンソースソフトウェア等々の先進技術分野での支援も展開しています。 |
記事の評価
|