Last Modified Saturday, 12-Nov-2005 22:31:20 JST
Home > J2EE

J2EEの世界(2002-02-11)

J2EEの肝はEJBではあると思いますが、それ以外にも多くのComponentsがあります、それらの習得のためにはここもOSSの素材を活用していきます。OSSのEJBコンテナJBossはリソースが少なくとも動作するらしいので、Cel400程度のマシンでも何とかなりそうです。


Application ServerとMiddleware、そしてJ2EE

Application Serverとは簡単にいうとクライアントインターフェースを担当するWebサーバ(HTML、JSP等のプレゼンテーション)、バックエンドに存在するDBシステムの間にあって、独立したビジネスロジックを実行するサーバという風にいえます。WebサーバとバックエンドのDBとの間にあるという点からはMiddlewareという用語も使われるようです。世の中のWebサービス、ここではXMLベースでデータ交換を行うSOAPとかではなく普通のインターネットサービスの意味、がHTTPプロトコルを利用して構築されることが大半になってくると、表現としてのHTMLドキュメントをXML文書やDBから”作成”とする手段が重要となってきますが、その手段としては処理の重たい、拡張性のないCGIではありえません。Enterprizeなシステム構築では、"write once, run anywhere"つまり互換性、移植性の保持というのは重要な命題になりますから、Application ServerといわれるものもJavaベースのものが主流と考えます 。

application server

実際の業務システムでは各サーバが一台だけという場合は少ないでしょうから、各サーバへのアクセスを平準化調整するload balancerのようなものが介在するのでしょうが、概念的には上のような構造になるのでしょうか。このように機能を階層ごとに明確に分離してアプリケーションを構成する手法がn-tier(n階層構成)と呼ばれ、各層ごとのAPIを明確に定義する事で、拡張性と移行性を保証できるようにしていると考えられます。もちろん層毎のAPIを各ベンダーが独自に定義してしまっては、互換性は確保できなくなるので、これらのAPIを標準化したものがJ2EEである、と考えてもいいと思います。

さてJ2EEの場合、Web systemの構成と言うのは以下のような構造となるでしょうか。もちろん以下の図は論理的な概念ですから、物理的にはそれぞれのComponentsはもちろん同一のサーバである必要は無く、分散環境が常でしょう。また、EJBを象徴的に表現していますが、J2EEそのものは多くの機能/コンポーネントから成るフレームワークです。

j2ee

単一のVM上で動作するアプリケーションから、J2EEのような分散環境アプリケーションへの拡張により以下のポイントについてはより一層考慮されるべき要件となってきます、

 このような分散環境で必要となる機能を意識(コーディング)させることなく、Business Logic(EJB)やPresentation(HTML, JSP, Servlet)の開発に専念できるようにすることが、J2EEを開発者側からみた場合には主たる目的と言えると思います。本質的にEJBは、限定された世界での分散アプリケーションの記述が目的ですが、分散アプリケーションの記述はEJBだけのものではもちろんありません。しかしEJBでは分散処理にかかわる部分はコンテナで隠蔽されて、ある程度の単純にアプリケーションが記述できるため、分散処理を扱う上の最初のステップと言えるでしょうか。JMS, JTA, JCA等の機能は、EJBコードからは最初は特に意識しなくとも良いのですが、このような機能(存在さえ)を意識させないプラットホームがJ2EEの意義といえます。その代償として何でもできるという自由度は失われるのですが、そのような用途はもともとEJBの適用対象外と考えるべきです。つまり、”トランザクション処理”、”リソース管理”、”セキュリティ管理”などは、EJBがJ2EEの表舞台の出演者とすると、これらの機能は裏方として働いていると理解すればいいでしょう。

ところで、通常言われるJ2EEはアプリケーションサーバが実装すべき仕様定義であり、J2EE SDKはそのリファレンス実装ですが、J2EE SDKの用途は教育、デモ等の商用以外であり商用使用は禁止されています。各アプリケーションサーバベンダは、J2EE SDK上でアプリケーションを動作させることにより、アプリケーションサーバ自身のJ2EE仕様との互換検証目的に使うことになるでしょう。ところで、JBossのHPによれば、J2EEというのはWeb用のOSという解釈なのだそうです。

"J2EE: AN OPERATING SYSTEM FOR THE WEB Enterprise web applications, which live on networks and are accessible through browsers, are redefining Enterprise Web Software. This is the next wave of computing. "

J2EEのキーワード

ではこのようなApplication serverが動作する基本となっているものはもちろんJ2EEでは有りますが、すでに述べたように分散環境を前提で扱うために、J2SEからJ2EEには割と大きなGAPがありますから、まずは基本的な用語の理解、そして用語を理解するためには、自分でコードを書いて動かして見る必要があるのはもちろんです。

J2EEを理解するための必要と思われる用語と概念

分散object、アプリケーションでの関連用語

J2EEとの直接の関連はありませんが、分散オブジェクトやアプリケーションを考えるときには知っておく必要がありそうな概念です。

N Tierアプリケーション構造と機能分担

J2EEはN_Tier(N階層)コンポーネントベースのアプリケーション構築のためのフレームワークと言われます。つまり、各層のインターフェース(API)を明確に定義することで、開発も分散して出来るようになるわけです。もちろんこの思想はJ2EEシステム(各実行環境、コンテナ)を構成するコンポーネント、そしてEJB開発でのロールの考え方にもあるのですが、ここではJ2EEアプリケーション開発に絞った話題です。

このようなコンポーネントベースにすることで、開発の効率化とアプリケーションの移植性、メンテナンスの容易性というメリットを受けることが出来るようになるわけですが、アプリケーションの動作効率(性能)の観点からは、各層ごとのAPIを経由することによるオーバヘッドにより、マイナスに働くでしょう。しかし、アプリケーション開発する上でのメリットの方が勝るという考え方です。もちろんアプリケーションサーバというのは通常高価なハードウエアリソースですから、効率的なアプリケーションの作り方の考慮は必要なわけで、この観点からはデザインパターンの考え方が必要になってくるわけです。

以下は、J2EEでの各層と各々の層に対応するコンポーネントの代表的な例を整理した図です。ここでEJB(SessionBean)がビジネスロジックを記述するということから、Business層に属するのは当然ともいえるのですが、EntityBeanは実はBusiness層ではないことに注意が必要かと思います。つまりEntityBeanはO/Rマッピングを行うものという定義からすると、ビジネスロジックとResource(データベース)を結びつけるものということになりますから、Integration層に属するのです。従ってEntityBeanにビジネスロジックを記述するのは、邪道ということです。あと一点、サーブレット(Servlet)がMVCモデルでいうところのControllerとすると、なぜPresentationなの?という疑問も湧くのですが、Servletの役割がPresentation(JSP)とBusinessロジックを結びつけるものであってビジネスロジックでは無いと考えられるので、Presentation層に属すると考えるのが自然と思います。

layer

もちろん全てのアプリケーションがこのような層構成を取るとは限らず、servletからEntityBeanを呼び出す場合もあるのですが、それらは単純なロジックの場合だけであって、”エンタープライズなアプリケーション”という場合には、多かれ少なかれここに挙げた層を要素として持つと思います。またこのような階層構造をとることで、セキュリティ的にも強固なものになることは容易に想像できますから、EntityBeanのような重要なデータへのアクセスメソッドは、出来る限りClientから離したレイヤーに配置しておくべきと思います。

J2EEのSample application

J2EEの実例としてSunからはPetStoreというApplicationがリリースされています。Windows上にInstallして動かしてみました。

このApplicationはCloudscapeというDB、そしてJ2EE Serverを起動させBrowserからPort8000でRequestすることで動作します。立ち上げて動作させて気づいたこと。

ともかく、単純そうに見えるサンプルアプリケーションなのですが、EJBの機能を理解するには好適であり、また奥の深いものがあります。

petstore

このSample ApplicationはJ2SEの版数が1.4だと動作せず、1.3を要求してきます。

j2sdkse1.4.0, j2sdkee1.3.1, Tomcat4.0.2のinstall

EJB containerの動作環境構築のため、専用のサーバ(Linux RedHat7.2)を用意しました。Cel400、128MBですから、CPU性能はともかくメモリサイズはまったく足りないと思います。j2seとj2ee、それにEJB containerと言うのは独立した存在ではなく、お互い連続した理解が必要なので、まずはJNDIやRMIなどの分散環境を扱う道具を理解していくことにします。まずはj2eeのRI(Reference Implementation)としてSunから提供されているj2sdkeeをインストールして見ます。

j2sdkse install

RedHat7.2でサーバ立ち上げ時に、現在の最新1.4.0をinstallしてあります。http://nemuneko.com/nifty/RH7.2/renew.html#label002を参照してください。Tomcat4.0.2のお勧めは1.3.1なのですが、今後は1.4が主流となっていくでしょうから。

j2sdkee install

j2eeとはseから独立して存在しているわけではなく、アドオンのような位置付けです。現在の最新版は1.3.1になるのでSunのサイトからダウンロードしてseと同じく/usr/local/srcディレクトリで自己解凍しました。


# cd /usr/local/src
# tar zxvf j2sdkee-1_3_1-linux[1].tar.gz

このあとで、$J2EE_HOME/bin/j2ee &とコマンド入力するとJ2EEが立ち上がります。この状態でJ2EEのデモアプリケーションのDeployment toolやデモアプリケーションは動作できる状態と考えていいと思います。しかし、Tomcatと同時に立ち上げると128MBでは完全にSWAPも発生してしまいます。またJ2EE起動時には & を付加してback ground動作としないとConsolが占有されてしまいます。まあ、これはInstallしてみただけ、EJBはJBoss上で動かしてみます。

Tomcat4.0.2 install

j2eeのreference実装とTomcatの協調動作はできないようですが、世の中のフリーのアプリケーションサーバではTomcatをServlet containerとして利用する場合が多いので、最新版である4.0.xをInstallしてみました。特にSource版から作成する必要は感じないので、Binary版をダウンロードしてきました。これも同じく/usr/local/srcディレクトリで展開します。


# cd /usr/local/src
# tar zxvf jakarta-tomcat-4.0.2.tar.gz
# cd /usr/local/src/jakarta-tomcat-4.0.2/bin
# ./startup.sh

動作確認はhttp://192.168.0.9:8080/でページが表示されれば大丈夫です。TomcatのHTTPサービスにはPort8080を使っています。

Apacheのinstall

性能や堅牢性においてTomcatのHTTPサーバに比較してApacheのほうが優れているので、Apacheとの連携動作をさせます。現在のApacheの最新版数は1.3.23となります。


# cd /usr/local/src
# tar zxvf apache_1.3.23.tar.gz
# cd apache_1.3.23
# ./configure --enable-rule=SHARED-CODE --enable-module=so	// DSO付でのCompileが必須です。
# make
# make install
# /usr/local/apache/bin/apachectl start

以上でブラウザからhttp://192.168.0.9/でrequestするとApacheの起動が確認できます。

TomcatとApacheの連携動作設定

TomcatとApacheのコネクタには従来と異なり、新しいModuleが使われるようになりました。同じくTomcatのダウンロードセンタからwebapp-module-1.0-tc40-linux-glibc2.2.tar.gzをダウンロードします。


# cd /usr/local/src
# tar zxvf webapp-module-1.0-tc40-linux-glibc2.2.tar.gz
# cd webapp-module-1.0-tc40
# cp mod_webapp.so /usr/local/apache/libexec

httpd.confへの設定

server.xml(Tomcatの設定ファイル)に、以下のように記述されていますから、要請とおりにhttpd.confファイルの一番最後にModule load指定を記述します。

        The MOD_WEBAPP connector is used to connect Apache 1.3 with Tomcat 4.0
       as its servlet container. Please read the README.txt file coming with
       the WebApp Module distribution on how to build it.
       (Or check out the "jakarta-tomcat-connectors/webapp" CVS repository)

       To configure the Apache side, you must ensure that you have the
       "ServerName" and "Port" directives defined in "httpd.conf".  Then,
       lines like these to the bottom of your "httpd.conf" file:

         LoadModule webapp_module libexec/mod_webapp.so
         WebAppConnection warpConnection warp localhost:8008
         WebAppDeploy examples warpConnection /examples/

       The next time you restart Apache (after restarting Tomcat, if needed)
       the connection will be established, and all applications you make
       visible via "WebAppDeploy" directives can be accessed through Apache.

LoadModule webapp_module libexec/mod_webapp.so
WebAppConnection warpconn warp localhost:8008
WebAppDeploy examples warpconn /examples/

と言うことは、Web applicationを新規にdeploymentする場合には、WebAppDeploy行を追加しないといけないようです。

検証のために、$TOMCAT_HOME/webapps以下のdirectoryを以下のようにhttpd.confに追加してみると、きちんとApache経由で出力されています。たとえば、http://dsl.nemuneko.com/tomcat-docs/index.htmlのようにです。ただし、ここで存在しないWebAppをhttpd.confで指定してしまうとApacheの動作が異常になってしまうようです。Port80は開いているのですがHTTPリクエストに対して応答しなくなります。尚ここで$TOMCAT_HOME=/usr/local/src/jakarta-tomcat-4.0.2です。


WebAppDeploy webdav warpconn /webdav/
WebAppDeploy tomcat-docs warpconn /tomcat-docs/

TomcatのHTTPサーバ動作停止設定

server.xmlの中のPort8080の設定部分をComment outします。


<!-- 
    <Connector className="org.apache.catalina.connector.http.HttpConnector"
               port="8080" minProcessors="5" maxProcessors="75"
               enableLookups="true" redirectPort="8443"
               acceptCount="10" debug="0" connectionTimeout="60000"/>


  --> 

動作確認

以上で条件は整いましたが、起動や停止ScriptのPathを通しておいたほうが便利ですので、.bash_profileもしくは.bashrcに以下の記述を追加しておきます。ここにはj2sdkのための設定も含まれています。


export JAVA_HOME=/usr/local/src/j2sdk1.4.0
export J2EE_HOME=/usr/local/src/j2sdkee1.3.1
export PATH=$PATH:$JAVA_HOME/bin:$J2EE_HOME/bin:/usr/local/src/jakarta-tomcat-4.0.2
	/bin:/usr/local/apache/bin

Pathの設定を有効にした後で、startup.sh, apachectl startとTomcat, Apacheの順で起動すると、http://192.168.0.9/examples/jsp/index.htmlのようなアクセスが可能になり、ApacheのHTTPサーバにDispatchされたことが分かります。ちなみにこの状態でPort Scanを実行すると、以下のようなPortが開いているはずです。


Starting nmap V. 2.54BETA22 ( www.insecure.org/nmap/ )
Interesting ports on java2.nemuneko.com (127.0.0.1):
(The 1538 ports scanned but not shown below are in state: closed)
Port       State       Service
21/tcp     open        ftp                     
22/tcp     open        ssh                     
80/tcp     open        http                    
8009/tcp   open        ajp13                   


Nmap run completed -- 1 IP address (1 host up) scanned in 1 second

しかしさすがにCel400、128MBではメモリもぎりぎり、JSPのコンパイルも遅さを感じます。でもちょっと遅めサイトと思えば我慢できる範囲、メモリだけはJBossのためには増設しないとだめでしょうが。

以上はTomcat(Catalina)がスタンドアローンの場合ですが、JBossと同一VMで動作するように提供されている場合には、設定方法がTomcatのserver.xmlではなくJBossのMBeanを使ったものに変わっています。

フリーのアプリケーションサーバ

HPからも無償ででていますが、ここはOSSで行きたいところです。


Home > J2EE

Valid HTML 4.01!