5-5. アプリケ−ションサ−バ '99 末頃から (1) アプリケ−ションサ−バとは * 概要 今日アプリケ−ションサ−バというと、 Java の J2EE 仕様を実装した WebLogic なんか のソフトのことを言うが、実はアプリケ−ションサ−バという言葉は前からあった。クラ イアント/サ−バに対して、その間におくミドルウェアとしてのソフトである。単純な作 業ならサ−バ1台で構わない。それが顧客名をデ−タベ−スから検索して、商品管理ソフ トから在庫を確認して、画面を分かり易くしてクライアントに返す。サ−バ1台で全部処 理させるのは少々無理がでてくるというものである。そこでアプリケ−ションサ−バなる ものが登場する。仕事毎に他の幾つかのサ−バに任せて、自分はシナリオだけ描くという ものである。ビジネスロジックと実際の処理を分けると言われるのは、このことである。 今日(こんにち)言うアプリケ−ションサ−バの役割はどうなっているか。どうも3つの意 味というか機能を持っているようである。 1つは Java のアプリケ−ションの EJB の実 行環境としてのサ−バ。2つ目は作業におけるセキュリティ、トランザクション、セッシ ョンキ−プの機能。これは EJB を使うことで簡単に実現できるとされる。 3つ目は負荷 分散などの大量アクセスへの対応である。そしてこれらのベ−スにはWWWサ−バを使う。 WWWサ−バの CGI には Java の Servlet を使い、動的なコンテンツ生成にも対応する ため JSP を用意しておく。そして XML パ−サもあると便利と言うのが、大方のアプリケ −ションサ−バ製品となっている。便利から必須になりつつある。 しかしメインはWWWサ−バ側で Java のプログラム、 つまり Servlet を稼働させるこ とにある。これまでWWWクライアントで Applet を動かしていたのが、クライアントの 負荷を減らすように、できるだけサ−バ側で処理しましょうということになってきたので ある。WWWサ−バ+Servlet で最小限のアプリケ−ションサ−バと呼んでいいかと思う。 事実、市販ソフトはたいがい3種類ぐらい出していて、一番安いのではそんな構成になっ ている。EJB は Servlet から呼び出されて使われる。 EJB というのは分散オブジェクト であり、 別に EJB でなくってもただの Java のアプリケ−ションを分散オブジェクトに してもいいのだ。ただし結構大変な話になるわけだが。 * J2EE( Java 2 Platform Enterprise Edition ) とは いつ J2EE という言葉が出てきた。99年6月の Java の会議で発表され Java 2 を適用 分野に応じて J2ME/SE/EE の3っつに分けるとした。仕様が出たのは99年12月のこと らしい。J2EE は Servlet, JSP, EJB 1.1 といった技術を統合したWebアプリケ−ショ ンのフレ−ムワ−クの仕様である。Java 2 という名称自体は、98年12月に Java 1.2 を正式版として発表した際に出ている。では Java に関してアプリケ−ションサ−バとい う言葉が出たのはいつか。98年の秋頃だと思う。EJB 1.0 のドラフトが一応97年11 月に出て、98年3月の JavaOne 会議で発表されている。 それ以前からあった Servlet との機能があわさって、アプリケ−ションサ−バという言葉、それに製品が出て来たよう である。 98年の暮れにイントラネットを研究テ−マにしたいと言う学生からメ−ルをもらい、じ ゃアプリケ−ションサ−バをやったらと返事したことがあった。まだその当時はアプリケ −ションサ−バといっても未熟で、いう程は話題にはなっていなかった。JDK 1.x をベ− スにしている製品がほとんどで、EJB も 1.0 対応でしかなかった。 EJB 1.0 では永続オ ブジェクト化をサポ−トしてなくて、ビジネスに本格的に使えるものでなかったという話 である。そんな状況下でも WebLogic というのが一番対応が早く、国内でも99年の秋に は実際にビジネスで使用している事例が出てきた。これにはいささか驚かされた。ちょっ と気が早過ぎるのでないかと小生は今でも感じているのだが。 WWW サ−バ EJB サ−バ ------------------- -------------------- | --- --------- | RMI 等 | --------------- | JNDI で EJB の場所を特定 | |H|→|Servlet|←―――――→| ------- | | する。コンテナの中にトラ | |T| --------- | | | | EJB | | | ンザクション性を確保する | |M| ↑ | | | ------- | | JTS が動いている。他にも | |L| ------ | | | EJB コンテナ| | 勝手にいろいろ動いている | --- |JNDI| | | --------------- | みたいです。 | ------ | | | ------------------- -------------------- 上は J2EE 実装のアプリケ−ションサ−バのイメ−ジである。EJB というのは、EJB コン テナという環境化で稼働する。このコンテナとはセッションの維持とかトランザクション やセキュリティを確保するための器みたいなものである。 この中で EJB を実行させてお けば、周辺の細かいことはめんどうみますというのが EJB コンテナなわけである。 そし て EJB というのは、JavaBeans みたいなコンポ−ネント、 つまり Java の部品であって プップと組み合わせていっちょあがりということらしい。EJB は Java のプログラムのた めWWWサ−バ側のプログラムも Java で、Servlet が使われる。両者間のやりとりには、 分散オブジェクト技術の Java RMI、もしくは CORBA/IIOP 対応の Java IDL が使われる。 [ 本章で出て来る用語 ] IDL : Interface Defintion Language IIOP : Internet InterOrb Protocol RMI : Remote Method Invocation JNDI : Java Naming and Directory Interfaces BDK : Beans Development Kit CORBA: Common Object Request Broker Architecture OMG : Object Management Group ORB : Object Request Broker JTS : Java Transaction Services( Java の OMG CORBA 製品の一つ ) * Java コンポ−ネント ・JavaBeans は再利用するための部品仕様であり、できたプログラムでもある。Appletの 部品として使うといった記事が多いが、Java アプリケ−ションでも使うことができる。 ・Java プログラムは Java VM( Java Virtual Machine )という環境下で動く。 WWWサ −バと Java VM 環境は普通は別である。 ・Java Applet はWWWブラウザにダウンロ−ドして実行する Java 部品プログラムであ る。WWWブラウザには Java VM が組み込まれている。 ・Servlet はWWWサ−バで動く Java 部品プログラムである。JavaBeans などのコンポ −ネントを利用して作成する。 ・EJB( Enterprise JavaBeans ) は JavaVM の中の EJB コンテナという環境で動く。EJB には Session Bean と Entity Bean がある。 ・EJB オブジェクトは Servlet や Applet などの Java プログラムと通信する。 通信プ ロトコルは RMI、IIOP、RMI over IIOP である。 ・フリ−ソフトで EJB を開発して、実行できるか。 どうもフリ−な環境はないみたいだ。 EJB コンテナとはなんだ。分からん!。WebLogic なんかのデモでも見て理解するか。 * Java でのプログラム開発 Java プログラム | |- Java アプリケ−ション | |- ただのアプリケ−ション | |- Applet ( WWWブラウザの中で稼働する ) | |- Servlet ( WWWサ−バの中で稼働する。Server Side Applet ) | |- Java モジュ−ル |- ただのモジュ−ル |- JavaBeans ( BDK があると便利。クライアント&サ−バで稼働 ) |- Servlet ( JDK 1.2 beta2 から作成できる ) |- EJB ( 市販開発ツ−ルでないと作れない。Enterprise JavaBeans ) WWWでは HTML ファイル作成のため JSP も使われる。 WWWクライアントがWWWサ −バにアクセスし xxx.html ファイルをロ−ドする。 その中に Servlet へのリンクがあ り、それにアクセスするとWWWサ−バ側で Servlet が実行され、 結果を HTML ファイ ルで返す。その HTML のタグなどを Servlet プログラムの中で記述しておく訳だが、 結 構めんどうな記述になる。そこで Servlet から JSP を呼び出して、 HTML ファイルを作 ってもらうのだ。JSP の記述は Servlet よりも簡単に、PHP3 ライクに HTML のタグを記 述できる。JSP はコンパイルされて、稼働時の実態は Servlet となる。 RMI の開発には、rmic と rmiregistry というコマンドがいる。JDK 1.1.6 には入ってい た。もちろん JDK 1.2 にも入っている。IDL ファイルに相当するのを RMI では、リモ− トインタ−フェ−スという。idltojava コマンドに相当するのは rmic、Java RMI スタブ コンパイラという。Java IDL は Java 2 には、コア・ライブラリは入っている。 しかし IDL コンパイラ idltojava は別にダウンロ−ドする必要がある。 | IDLコンパイラ | ネ−ムサ−ビス ----------|---------------|--------------- Java IDL | idltojava | tnameserv << デフォルトは 900 番ポ−ト。 Java RMI | rmic | rmiregistry << デフォルトは 1099 番ポ−ト。 * EJB なるもの `02/12/26 |-- Session Bean --- Stateless Type EJB--| |- Stateful Type |-- Entity Bean ---- BMP( Bean Managed Persistence ) |- CMP( Container Managed Persistence ) まだこれらのサンプルなどを試した訳でない。なかなか取りつきが悪くていけない。これ がすっと分かれば、今なら大金持ちになれるぞ。まあ、そんなことはいい。今漠然と感じ ていること。EJB はオブジェクト指向プログラミング、そしてオブジェクト指向デ−タベ −ス( OODB ) そのものでないか。Session Bean はアプリケ−ションの中で生成、消滅す る揮発オブジェクト( Volatile Objects ) といえる。 Stateless Type の Session Bean は、まさにこの Volatile Objects であり、Stateful Type はその消滅する時期をコント ロ−ルできるオブジェクトと言える。どちらも一時的なオブジェクトであることには違い はないが、Stateful Type の方はアクセス・ユ−ザごとの専用オブジェクト的な使い道と して、よく用いられるようである。 Entity Bean の方はアプリケ−ションが終了しても、消えずに残る永続オブジェクトのイ メ−ジに近い。OODB では永続オブジェクト( Persistent Objects ) は、アプリケ−ショ ン稼働のメモリ中に存在するのと同じことで、アプリケ−ションが終了しても、消えずに 残っているとみなすことができる。近いと言う表現は Entity Bean は RDB からのマッピ ングを伴って、永続オブジェクトのように扱われるためである。 BMP と CMP の違いはマ ッピング、即ちデ−タベ−スへのアクセスを EJB コンテナにお任せするか(CMP)、自分で SQL を発行して細かく制御するか(BMP)という違いのようである。CMPを用いてプログラム 開発する場合、SQL をコ−ディングしなくても、EJB が自動的にやってくれるという。こ れは大きなメリットである。EJB はこのようなカプセル化によって、プログラム開発の手 数を減らすということである。 * 参考:Solaris 9 にある Java の実行環境は # ls -l /usr drwxr-xr-x 9 root bin 512 1月 31日 2006年 j2se lrwxrwxrwx 1 root other 17 1月 30日 2006年 java -> jdk/j2sdk1.4.2_05 drwxr-xr-x 6 root bin 512 1月 31日 2006年 java1.2 drwxr-xr-x 2 root bin 512 1月 30日 2006年 jdk # ls -l /usr/jdk lrwxrwxrwx 1 root other 7 1月 30日 2006年 j2sdk1.4.2_05 -> ../j2se # ls -F java1.2 COPYRIGHT bin/ ja/ jre/ man/ # cd /usr/j2se # ls -F COPYRIGHT README.html include/ man/ LICENSE bin/ jre/ opt/ README demo/ lib/ src.zip # ls -F bin HtmlConverter jarsigner javah orbd serialver appletviewer java javap policytool servertool extcheck java-rmi.cgi jdb rmic sparcv9/ idlj javac keytool rmid tnameserv jar javadoc native2ascii rmiregistry # ls -F jre CHANGES Welcome.html COPYRIGHT bin/ ControlPanel.html javaws/ LICENSE lib/ README plugin/ THIRDPARTYLICENSEREADME.txt * 参考:Solaris 9 にある Apache は # diff /etc/init.d/apache /etc/rc2.d/K16apache 同じもの。 /var/apache も /usr/apache の中身も同じ日付けになっている。 これらのソフトウェア は全部、一度期に一緒に入ったものと思われる。 perl5 も tomocat も Apache に入って いたと思われる。 # ls -F /var/apache cgi-bin/ htdocs/ icons/ logs/ proxy/ servlets/ tomcat/ # ls -F /usr/apache bin/ htdocs/ include/ jserv/ libexec/ man/ perl5/ tomcat/ /etc/init.d/apache ------------------------------------------------------------- |#!/sbin/sh |APACHE_HOME=/usr/apache |CONF_FILE=/etc/apache/httpd.conf |TOMCAT_CF=/var/apache/tomcat/conf/server.xml | | | (CATALINA_HOME=${APACHE_HOME}/tomcat; export CATALINA_HOME; | CATALINA_BASE=/var/apache/tomcat; export CATALINA_BASE; 環境変数を設定 | JAVA_HOME=/usr/java; export JAVA_HOME; している辺り。 | | # ls /etc/apache README.Solaris magic access.conf mime.types httpd-standalone-ipp.conf mime.types.new httpd.conf-example srm.conf jserv.conf tomcat.conf jserv.properties zone.properties # cd /usr/apache/bin;ls ab checkgid htpasswd logresolve apachectl dbmmanage httpd rotatelogs apxs htdigest jserv_shmedit suexec.disabled # ./httpd -v Server version: Apache/1.3.31 (Unix) Server built: Aug 19 2004 10:18:38 # /etc/rc2.d/K16apache start ブラウザでみると "あなたの予想に反して、このペ− httpd starting. ジが見えているでしょうか?" が出ているはず。 # ls -F /var/apache/tomcat conf/ logs/ webapps/ work/ # ls -F /usr/apache/tomcat bin/ common/ lib/ server/ [/usr/apache/tomcat] | |--[bin]--- bootstrap.jar jasper.sh shutdown.sh catalina.sh jspc.sh | startup.sh digest.sh setclasspath.sh tool-wrapper.sh | |--[lib]--- jasper-compiler.jar jasper-runtime.jar naming-factory.jar | |--[common]---[classes]--- 空 | |-[lib]--- activation.jar mail.jar tyrex-0.9.7.0.jar | jdbc2_0-stdext.jar naming-common.jar | jndi.jar naming-resources.jar xerces.jar | jta.jar servlet.jar tyrex.license | |--[server]---[classes]--- 空 |-[lib]--- catalina.jar servlets-ssi.renametojar warp.jar commons-logging.jar servlets-webdav.jar jakarta-regexp-1.2.jar tomcat-ajp.jar servlets-cgi.renametojar tomcat-coyote.jar servlets-common.jar tomcat-http11.jar servlets-default.jar tomcat-util.jar servlets-invoker.jar servlets-manager.jar (2) アプリケ−ションサ−バ製品 * WebLogic アプリケ−ションサ−バ `02/10 [ WebLogic Server 4.5 ] Java 2 SDK 1.2.2 対応 http://weblogic.nexusnet.ne.jp/。'99/02/25, アプリケ−ションサ−バのはしりである。 この分野、世界での半分以上のシェアを占めている。その後 BEA 社に買収された。 国内 では住商エレクトロニクスが扱っている、紹介セミナ−も東京で月1でやっている。以下 `02/02/28 調べ。WebLogic Server 4.5、1サ−バ(1 CPU) ライセンスが 234 万円。開発 だけなら BEA WebLogic Developer、46.7 万円でできる。 実際に運用する際に 234 万円 のを買えばいい。NT, Solaris など Linux にも対応する。http://www.beasys.co.jp/ こ こから30日間お試しのダウンロ−ドができる。EJB 用の開発ツ−ルは WebLogic にはな い。シマンテックの VisualCafe Enterprise がいいようである。 購入にあたっては、インスト−ルするマシンのIPアドレス、マシンの機種にOSとバ− ジョン、それにデ−タベ−スの名前を連絡する。これでライセンスが発行される。対象デ −タベ−スのソフトは Oracle/Sybase/Informix である。とりあえず使わなければそれで もいい。購入して来るのは本当ライセンス証書だけ。箱に入った CD-ROM とか取説はない。 保守は初年度から入ることになっていて、開発版の場合は約7万円だった。保守を継続し ないと、現バ−ジョン、現IPアドレス、サポ−トなしパッチなしでだったら使い続ける ことはできる。ライセンス証書に書かれている永久的ライセンスに意味である。IPアド レスを変更したいとか、新しいバ−ジョンが欲しいとか言うなら保守は引き続き契約した 方がよい。しかしメ−ルや書面など、どこにも保守の期間が明記されたものがないのだが。 [ BEA WebLogic Server 6.0.1 日本語版 ] J2EE Ver.1.2 完全対応、Ver.1.3 部分対応 `21/03 出荷開始。EJB 1.1/2.0, Servlet 2.2, JSP 1.1 対応。 JavaMail, JMX を新規対 応。自動デプロイ、2フェ−ズコミットの対応。JAXP( Java API for XML Parsing )実装。 XML Parser は Apache のが組み込まれた。SOAP のインプリメンテ−ション。WWWサ− バとしては 128 bit SSL 対応。開発環境は元 VisualCafe だった webGAIN か Borlandに 名前が戻った JBuilder4 Enterprise Edition がいい。JBuilder4 が結構いけてるようで ある。しかし、(株)イ−シ−・ワンの最首氏いわく、これら統合開発環境でなくてもただ のエディタでガシガシ書いても構わない。 イ−シ−・ワンは EJB を使ったアプリケ−シ ョン開発のオ−ソリティといっていい。一歩先を行く先見性のある会社だ。 2001年3月、名古屋で WebLogic のセミナ−があった。なんて出席人数が少ないこと。 アプリケ−ションサ−バの構築、3ヵ月位の短期間で開発する事例が増えているらしいが 東京でのことだ。しかも名の通った企業でのECサイト構築だ。まあ、セミナ−の話を少 し。WebLogic のシェアは30%以上。デ−タベ−スにアクセスするのに、 SQL なんか自 分で記述しなくてもよい。EJB がやってくれるので、簡単にコ−ディングできる。EJB に よるコンポ−ネントモデルで、素早くプロトタイプを作ることができるという。 * その他市販アプリケ−ションサ−バ `02/03 時点 Inprise Application Server 4 [ Java 2 SDK 1.2.2 対応 ] > Inprise 開発、元 Borland。98年4月社名を変えている。`02/01/25 出荷開始。開発 キット1名用は 27 万円。無制限の運用ライセンスは 150 万円である。Windows NT ま たは Solaris。EJB 1.1, CORBA 2.3, JSP, Servlet 対応。 ORB は VisiBroker が入っ ている。EJB の開発は JBuilder Enterprise でやる。EJB は RMI over IIOP で通信す る。Linux 用も開発していて、`02/02/04 60日間使える英語版のダウンロ−ドを始め ている。Borland 製品は小生 Turbo Pascal から使っているが、非常に使いやすい。期 待したいものである。 WebSphere Application Server 3.0 [ 対応 JDK は 1.1.6/1.1.7 ] > IBM作成。デモ版がダウンロ−ドできる。これで一通り何ができるか分かる。フルセ ットで購入すると800万円ぐらいいる。IBMは自前でサポ−トはしないみたい。代 理店を探しているもよう。スタンダ−ド版は Servlet 実行環境、JavaServer Pages サ ポ−ト、XML/XSL サ−ビス対応。アドバンスド版は EJB、RMI、IIOP 対応。エンタ−プ ライズ版は大規模トランザクションに対応する。Windows NT, AIX, Solarisで稼働。開 発は添付の WebSphere Studio で行う。EJB は VisualAge for Java エンタ−プライズ 版で行う。これにはテスト用 EJB サ−バ環境がある。'98/12 出荷開始で 42 万円。 他にもいっぱいある。Oracle Application Server。Sybase社の Enterprise Application Server。Netscape Application Server、これは Sun の製品とドッキングして、Netscape Alliance という製品名なのか、プロジェクトの名前かしゃんになっている。 ニチメンデ −タシステム(株) 扱いの SilverStream Application Server というのも結構前からある、 3.0 が `02/02 発売で XLM、EJB 1.1 対応。開発版 45 万円から、 運用は 250 万円から ということだ。富士通の INTERSTAGE というのもあるが、まあいいか。 * お勧めは? とりあえず WebLogic かな、開発版で EJB まで含んでいるのがいい。 IBMのアプリケ −ションサ−バだと、EJB 機能まで含めると700万円とか800万円近くになってしま う。高い!。それに Java の環境もちょっと独自みたいだし。さて WebLogic 買ったはい いが、マニュアルもオンラインで見て頂戴とはどうしたものか。Borland のCやC++は、 たかだか数万円だったのに、分厚いマニュアルがついてきたものだ。アプリケ−ションサ −バの分野、こうしたことも含めてノウハウになっているようである。まあ最近は何を買 ってもちゃんとした本になったマニュアルはないことが多い。あっても別売りだとか。そ うこうする内、無料のアプリケ−ションサ−バが登場した、Zope という。 Solaris 9 に もフリ−のアプリケ−ションサ−バが入っているということだ。Solaris 9 のマシンを1 台買うか。EJB とかまで言わなくても、 とりあえず Servlet 環境だけでもパっと手に入 ればうれしいものです。Apache に Tomcat とかのインスト−ルは結構めんどうだし。 (3) Java RMI と HORB を試してみる * Java RMI を試してみる /usr/share/jdk-1.1.16v2/docs/guide/rmi/ |- getstart.doc.html release-notes.html getstart.doc.anc.gif index.html |- [spec] |- [examples] Applet 用 HTML ファイル。 |- [hello] ↓ readme.html readme.txt index.html Hello.java HelloApplet.java HelloImpl.java run run.bat << Solaris 用と Windows 用のバッチファイル。 TurboLinux 3.0 の JDK に入っていたサンプルを試してみる。]#chmod +x run; ./run で コンパイルして、実行までやってくれるはずだが、いろいろエラ−が出てしまう。 hello ディレクトリを別にコピ−して、ユ−ザ katou でごそごそやってみる。 ファイルをコピ −したら、]#chmod 777 * をとりあえずやって、Java の CLASSPATH もちゃんと次のよう に設定する。 プログラムは package とか codebase とかいったディレクトリ依存の変数 はなしにして、モジュ−ルとうは全部同じディレクトリにおくことにした。RMI のかなめ の Naming.lookup("rmi:///HelloServer") で///、これはカレント・ディレクトリから探 すことを意味する。Naming.lookup("///HelloServer") でも動いた。"//HelloServer" だ とエラ−になる。書式は rmi://host:port/name である。 /home/katou/.bashrc ---------------------------------------------------------- |export CLASSPATH=.:/usr/share/jdk-1.1.6v2/lib/classes.zip ]# javac *.java << Hello.class, HelloImpl.class, HelloApplet.class ができる。 ]# rmic HelloImpl << HelloImpl_Skel.class, HelloImpl_Stub.class ができる。 ]# rmiregistry << /usr/share/jdk-1.1.6v2/bin/ にあります。 ]# java HelloImpl ]# /usr/share/jdk-1.1.6v2/bin/appletviewer index.html index.html ---------------------------------------------------------------- | | | Hellow.java ---------------------------------------------------------------- |public interface Hello extends java.rmi.Remote { | String sayHello() throws java.rmi.RemoteException; } HelloApplet.java ---------------------------------------------------------------- |import java.rmi.*; |public class HelloApplet extends java.applet.Applet { | String message = ""; | public void init() { | try { | Hello obj = (Hello)Naming.lookup("rmi:///HelloServer"); << ここ注意。 | message = obj.sayHello(); } | catch (Exception e) { | System.out.println("HelloApplet: 何かエラ−です"); | e.printStackTrace(); } | } | public void paint(java.awt.Graphics g) { | g.drawString(message, 25, 50); } |} HelloImpl.java ---------------------------------------------------------------- |import java.rmi.*; |import java.rmi.server.*; | |public class HelloImpl extends UnicastRemoteObject implements Hello { | private String name; | public HelloImpl(String s) throws java.rmi.RemoteException { | super(); name = s; } | | public String sayHello() throws RemoteException { | return "Hello Katou"; } << うまく行けば Applet にこの文字列がでるはず。 | | public static void main(String args[]) { | System.setSecurityManager(new RMISecurityManager()); | try { | HelloImpl obj = new HelloImpl(""); | Naming.rebind("rmi:///HelloServer", obj); << ここも注意。 | } catch (Exception e) { | e.printStackTrace(); |} } } rmiregistry を稼働させたままで、HelloImpl.java の "Hello Katou" を変えて、このプ ログラムだけコンパイルし直す。稼働させている HelloImpl を終わらせて、 再度起動す る。そして appletviewer の画面のメニュ−から Reload をクリックしてみる。変えた文 字が出てくる。つまりサ−バ側のプログラムはクライアントに関係なく、修正したり内容 を変更したりできるということを意味する。 * HORB を試して見る マシンは上のまま TurboLinux 3.0、JDK 1.1.6 とする。HORB は雑誌「ジャバワ−ルド」 `02/04 の CD-ROM から HORB Version 1.3 beta4 をインスト−ルしてみる。CD-ROM の説 明には Windows 版と Solaris 版の HORB とか書いてあったが、Linux でも何の問題もな かった。実際 HORB のコマンド、horbc や horb はシェルスクリプトで java コマンドを 呼び出しているだけである。 HORB には現在 1.3 bata4 の安定版と 2.0 beta1 の基本パ ッケ−ジがある。さらに IIOP 機能などを追加する拡張パッケ−ジが別にある。下記のサ ンプルは上の Java RMI のプログラムと同じようなものだが、えらく簡単な記述で済んで いるのが分かる。 ]# cd /home/katou ]# zcat horb13b4a.tar.gz | tar xvf - << /home/katou/horb 以下に展開される。 ]# /bin/csh ]# PATH に /usr/share/jdk-1.1.6v2 と /home/katou/horb/bin 追加のこと。 ]# setenv CLASSPATH /home/katou:.:/usr/share/jdk-1.1.6v2/lib/classes.zip /home/katou/sss/Server.java << http://openlab.etl.go.jp/horb-j/doc/ ---------------------------------------- guide/start.html にあるサンプルです。 |public class Server { | public String greeting( String name) { | return "Hello " + name + "!"; | } |} /home/katou/ccc/Client.java ------------------------------------------------------------------ |class Client { | public static void main( String args[] ) { | Server_Proxy server = new Server_Proxy( "horb://localhost/" ); | String result = server.greeting( "Katou"); | System.out.println( result ); | } |} [ /home/katou/sss/Server.java ] [ /home/katou/ccc/Client.java ] ]# horbc Server.java % ls << Server.java からこれだけできた。 Server.class Server_Proxy.class Server_Skeleton.class Server.java Server_Proxy.java Server_Skeleton.java ]# mv Server_Proxy.class ../ccc ---> Server_Proxy.class ]# javac Client.java ]# horb -v ]# java Client << サ−バ側で horb main: HORBServer(8887) started Hello Katou! をやってから実行。 Thread-6: creating an instance of Server Thread-6: HORB object H135070768 has been created サ−バ側で ]#java Serverと H135070768-0: Waiting for method call やってないことに注意したい。 H135070768-0: classNo = 1 method no = 1000 Client から horbを経由して H135070768-0: Waiting for method call Serverが起動される。あらか H135070768-0: disconnected - java.io.EOFException じめ Server を起動させてお H135070768-0: thread ended from createInstance く、デ−モンモ−ドというの H135070768-0: close connection も HORB にはある。 * INDY IRIX5.3 にインスト−ルした HORB の様子 % ls -l drwxr-xr-x 9 katou user 512 ... horb2.0 -rw-r--r-- 1 katou user 1002980 ... horb20b1.tar.gz % cd ../horb2.0;ls -F bin/ classsrc/ copyrigt.txt examples/ index.html classes/ copyrigt.htm doc/ images/ lib/ % ls -F bin horb* horbc* horbstat* horb.exe horbc.exe horbstat.exe % ls -F classes examples/ horb/ % ls -F classes/examples back.gif wclock/ wclock2/ worldClock/ logo.gif wclock.gif woclock.gif % ls -F classes/examples/wclock Server.class Server_Skeleton.class wclock.htm Server_Proxy.class WClock.class % ls -F classsrc Makefile doit.bat horb/ % ls -F classsrc/horb Makefile doit.bat horbc/ orb/ tools/ % ls -F doc download.html figs/ install.htm << figs には gif ファイルが3つ。 % ls -F lib horb20.jar horbc.jar orb.jar % ls -F examples Makefile doit.bat objRefSend/ README.htm equals/ objRefSend2/ accessControl/ exception/ objectStorage/ async/ hooks/ passObj/ back.gif inheritance/ passObj2/ clientServer/ inheritance2/ serverServer/ complex/ inheritance3/ wclock/ config/ interfaceCall/ wclock.gif connectionReusable/ interfaceSend/ wclock2/ constructor/ logo.gif woclock.gif daemon/ multiServer/ worldClock/ % ls -F examples/daemon Client.class README.txt Server_Skeleton.class Client.java Server.class daemon.conf Makefile Server.java MakefileDos Server_Proxy.class (4) 分散オブジェクト技術 * オブジェクト間通信とは C++でのオブジェクトというのは、C++プログラムを実行したプロセスの中でのみ作 られて、存在する。そしてオブジェクトの関数をコ−ルしあう。つまりオブジェクト間通 信である。実態はただの関数コ−ルでしかないが。別なC++プログラムがあって同じマ シンで実行されても、それとは関係がない。CORBA は別なプログラムであっても、そして 言語、違うマシンでもいいというものである。Java RMI は Java 言語同士、 限定という 代物である。他にも Microsoft の DCOM、 最近は DCOM+ というのも出しているようだが。 それに HORB というのもある。これら分散オブジェクトというのは、いろいろうんちくは あるが、基本的には先に述べたように、他のプログラムのル−チンを利用することにある。 オブジェクト的にえば、メソッドを利用するということである。 分散オブジェクトの大御所、CORBA というのはだいぶ前から目にする。1981 年頃、 最初 の仕様ができている。OMG という団体が制定しているのだが、非常に分かりにくく、なか なか日の芽をみなかった。Java が出てきてやっと、 実際使えるようになったといっても いい。CORBA が理解できにくい原因は、仕様がでか過ぎて通信という大元の機能がかすん でしまっているためである。本や雑誌で CORBA の話を読むと CORBA サ−ビス、CORBA フ ァシリティ、セキュリティサ−ビス、トランザクションサ−ビス、永続オブジェクトサ− ビスなんたらと能書きばかりが続く。具体的にどうプログラムを書くのかという肝心の話 がない。CORBA はあくまでも仕様なので、プログラムを示せなかったのである。 CORBA のオブジェクト間通信の実装は ORB という。 仕様と実装の関係はドメイン名管理 の BIND と named と同じだと思ってよい。BIND 何々というソフトはないわけで、 CORBA の方も、Transaction ORB SYSTEMν といった製品名になる。ORB は CORBA の中核機能だ が、オブジェクト間通信のいわば媒体であり、一機能だと思う。ネ−ミングサ−ビスがな ければ、サ−ビスするオブジェクトを特定できない。ORB 製品という言い方はいかがなも のか。以下、幾つかの ORB 製品を示す。Java IDL だけタダ。手元に以前展示会でもらっ た SYSTEMν のパンフレットがある。値段はご相談で月額使用料がいるのだと。エ−ジェ ント指向によるネットワ−ク自律協調システムの実現とか、すごい文句が踊っている。う んちくばかりで、値段は不明と言うのが3年前ぐらいまでの実態だった。 [ ORB 製品 ] CORBA の最新バ−ジョンは 2.3、`02/03 Java IDL : Java の機能に入っている。CORBA 2.0 に対応する。 Orbix : 米 IONA Technology 社開発。確かTISもかついでいた。 VisiBroker : 現在 Inprise 社所有。Sun 社も採用している。 SYSTEMν : 日本ユニシス、CORBA 2.0 に準拠。Oracle が必要?、そんな訳ない。 * CORBA の仕組み CORBA における ORB( Object Request Broker )の、 自分のイメ−ジは違っていたようだ。 最小限のシステムでは ORB は1個あればいいと思っていた。 ORB がサ−バプログラムで サ−ビスできるメニュ−を持つものだと思っていた。実はその役目をするのはネ−ムサ− ビスのプログラムだった。下の図は CORBA の "静的呼び出し" という仕組みだが、 クラ イアントは、ネ−ムサ−ビスに登録されたサ−ビスの名前やら引き数やら、あらかじめ知 っておかなければならない。動的呼び出しというのもあって、もう少し柔軟な仕組みがと れるようになっているらしい。 サ−バ S1 ネ−ムサ−ビス クライアント C1 -------------------------------- ----------- ------------------------ | orb1 calc | | "ccc"が | | static ccc KEISAN | | ----- 登録 --------------- | | 登録され| | | | |ORB|←――| | | | ている | | ----- orb2 | | ----- | add メソッド| | ----------- | |ORB| | | | | sub メソッド| | ↑ ↑ | ----- KEISAN.add() | | | --------------- | | | | | KEISAN.sub() | ------|------------------------ | | ------|---------------- | bind or rebind | | resolv | ―――――――――――――――― ―――――――― "ccc" という名前で "ccc" という名前のサ−ビスを呼 calc を登録する。 び出し、KEISAN という名前にした。 ]# java S1 -ORBInitialHost ]# tnameserv ]# java C1 -ORBInitialHost ------------- -------------- ------------- -------------- |例えば Java| |例えばC++| |例えば Java| |例えばC++| |サ−バ | |クライアント| |サ−バ | |クライアント| ------------- -------------- ------------- -------------- | | | | ----- ----- ----- ----- |IDL| Skeleton |IDL| Stub |IDL| Skeleton |IDL| Stub ----- ----- ----- ----- | | | | ----------------------------- -------- IIOP ------- | ORB Core | | ORB |<------->| ORB | ----------------------------- -------- も可 ------- << よくある図だが悪い説明 >> << こういう図で説明せないかん >> 左の図の TCP/IP の階層構造みたいな図で、CORBA を説明しているのをよく見受ける。あ まりよろしくない。ORB もプログラムであり、オブジェクトである。正確にはサ−バやク ライアント内のオブジェクトである。 右図のように描けば ORB 間同士の通信ということ がよく分かるだろう。サ−バ側とクライアント側で ORB のソフトが違っていても、 IIOP という共通プロトコルだったら、通信できるよということである。 同じ ORB のソフトを 使う場合は、IIOP でなくてもいいということだが、何を使うのだろう。Socket 通信なの だろうか。どうもそれ臭い。一度 Sniffer なんかで調べてみる必要がある。 一応 GIOP( General Inter-ORB Protocol )が ORB 間の通信の規約になっている。 それを TCP/IP 上で実装したのが IIOP( Internet Inter-Orb Protocol )という ことである。IIOP は 1994 年終わり頃に発表された CORBA 2.0 仕様から入った。 IDL は別段力入れて解説するまでもないぞ。サ−バでは何らかのサ−ビスをする。それを 外から利用するためには、サ−ビスのインタ−フェ−スが分かっていないことには、だめ だ。何を入力して、どう結果がかえるか、それがクライアント、サ−バ共に分かっていな ければだめということである。サ−ビスとは例えば、2つの整数をサ−バにわたして、足 し算をし、結果を頂くというようなことである。IDL はコンピュ−タ言語に関係なく、そ のようなインタ−フェ−スを定義する単なるスクリプトでしかない。CORBA では異機種分 散オブジェクトをうたい文句にしているので、IDL の定義ファイルから、Fortran でもC 言語用にでも、コンパイルしたモジュ−ルが作成できることを重要視した訳である。 少し用語の説明でもしておこう。 IDL の定義ファイルからC言語や Fortran などの言語 に変換することを言語マッピングという。ネ−ミングサ−ビスから、使いたいメソッドを 特定することを、オブジェクトリファレンスを得るという。そのメソッドのオブジェクト をリモ−トオブジェクトという。インタンスとオブジェクトの使い分けは、概念的にはオ ブジェクト、プログラム的に言えば実体としてのインタンスである。CORBA の動的呼び出 しに関するキ−ワ−ドには、インタ−フェ−スリポジトリ、動的呼び出し、動的スケルト ンといった用語がある。CORBA と言うのは通信の基本機能、周辺機能、応用レベルでの共 通機能など、全部を総合した体系みたいなものである。 * Java RMI の仕組み Java RMI には ORB に相当するものはない。クラスの継承で、オブジェクト内部に相当す る機能が隠蔽されていると考えられる。サ−バ/クライアントの内部で存在して、サ−ビ スするような機能に対し、表だってどうこう言う必要はないということである。RMI のネ −ムサ−ビス rmiregistry は、CORBA での tnameserv に相当する。rmiregistry の稼働 ポ−トは 1099 番ということだ。この番号ちゃんと IANA に登録されているものだろうか。 IANA のサイト少し見たみたが、無かったような気がするのだが。 ネ−ムサ−ビスが他の マシンにある場合は、下記の "ccc" とした所を "rmi://192.10.10.1/ccc" というように すればいい。 import java.rmi.server.* ; public class CalcSrc extends UnicastRemoteObject implements Calc { | | サ−バ S1 | ネ−ムサ−ビス クライアント C1 -----------------↓-------- ----------- ------------------------ | --------------- | | "ccc"が | | Calc KEISAN; | | calc | CalcSrc | | | 登録され| | | | | | | | ている | | | | | add メソッド| | ----------- | KEISAN.add() | | | sub メソッド| | ↑ ↑ | KEISAN.sub() | | --------------- | | | | | ------|------------------- | | --------------------|-- | | | | | Naming.rebind("ccc",calc)| |KEISAN=Naming.lookup("ccc") | ―――――――――――――― ――――――――――――――― "ccc" という名前で "ccc" という名前のサ−ビスを呼 calc を登録する。 び出し、KEISAN という名前にした。 ]# java S1 ]# rmiregistry ]# java C1 RMI のプロトコルは JRMP( Java Remote Method Protocol )という。RMI over IIOP とい うのが、Sun と IBM によって作成されているが、これは IIOP を利用する RMI というこ とである。RMI を IIOP に変換するプロトコルだと思う。これで RMI 経由で、 CORBA オ ブジェクトと通信しようということだと思う。 * HORB とは 雑誌「bit」で名前だけは目にしていた。これはすごい。 Java RMI なんかが出る以前 に日本人の手で作られた Java 用分散オブジェクト技術である。95年12月に最初のバ −ジョンができている。その日本人とは、電子技術総合研究所の平野聡氏といい、上司に 理解されずに自宅で骨身を削って開発したということだ。彼のホ−ムペ−ジを見ると、と ても人間臭い男で、小生は思わず共感を覚える。現在 HORB は、(株)エヌジェ−ケ−が強 力にサポ−トするなど、一般にも知られるようになってきている。(株)エヌジェ−ケ−は オブジェクト指向技術の普及を目指して、ホ−ムペ−ジに多くのノウハウを公開している。 http://www.njk.co.jp/otg/ を見られたし。HORB ともに評価に値する。 そしてオ−プンソ−スであるということ。99年2月にオ−プンソ−スとし、無償で商用 利用できるようにしている。99年12月、HORB 2.0 beta1 発表。 これで本格的に使え るようになったということだ。非同期メソッドの機能強化、IIOP サポ−ト、HTTP トンネ リング、ネ−ミングサ−ビスのサポ−トなど、続々と機能拡張中。RMI との接続や、Jini のサポ−トも予定しているとか。タ−ゲットマシンは JDK が稼働する環境なら、 どこで もOKということである。JDK のソ−スをいじるとか、ややこしい設定をするとかはない。 HORB のモジュ−ルを CLASSPATH で追加指定するだけである。これで Java RMI や CORBA より高速にオブジェクト間通信ができるようになる。 「bit」 1996/10 Vol.28 No.10 共立出版。中原真則、平野聡著す。 > 飛べ、オブジェクト!HORBプログラミングマジック[前編] P.4〜15 「bit」 1998/05 Vol.30 No.5, P.33〜35。平野聡著す。開発秘話が載っている。 > 特集:新人技術者研究者に捧ぐ、新人さんの天才のために。 http://openlab.etl.go.jp/horb-j/doc/guide/start.htm > 簡単なサンプルでの説明がある。RMI なんかと少しメカニズムが違う。 ざっと HORB での記述を見たところ、Java IDL や RMI よりも簡単に使えそうである。コ マンドはコンパイラの horbc と ORB としての horb である。horbc でサ−ビスする内容 を記述したサ−バ用の Java プログラムをコンパイルする。 本体クラスと Proxy それに Skeleton のクラスファイルができる。Proxy は CORBA の Stub に相当する。IDL の定義 ファイルは HORB では必要ない。horbc がプログラムのクラス定義から自動的に作ってく れる。クライアント側には Proxy クラスファイルを置き、 サ−バ側にはサ−ビスするプ ログラム本体と Skeleton のクラスファイルを置く。そしてサ−バ側で horb を稼働させ せる。クライアントがサ−ビスを呼び出そうとすると、 基本的には Proxy からサ−バの horb を経由して、サ−ビスするオブジェクトを生成し、それを使うことになる。 -------------------------------------------------------------------------------- 非同期メソッド、非同期通信とは。分散処理で幾つかのサ−バで処理を行う場合、直ちに 処理して依頼元に結果を返すなら問題ない。通常のプログラムは、結果がすぐ返って来る ことが前提になっている。それが処理が時間がかかる場合はどうなるか。依頼元が数分毎 にもう結果が出ているかなと見にいく、これはポ−リングという。もう一つ、サ−バ側が 処理を終わえた時点で、結果が出たよと依頼元に伝えるかである。 -------------------------------------------------------------------------------- (5) Java Servlet/JSP 実行環境 * Tomcat のセットアップ `02/05 Linux マシンにセットアップしようと思っていたが、マシンが借り物でかえしてしまった ので今のところできない。Apache 1.3.9 を INDY にインスト−ルしてあるのだが、 OS のバ−ジョンが IRIX 5.3 で Java の環境が対応できないのだ。マシンが用意できてから ここは、また取り組みたい。とりあえず Tomcat を入れるとして、ダウンロ−ドして中身 を覗いてみることにする。http://jakarta.apache.org/ を見ると、バ−ジョンは 3.1 に なっていた。Java Servlet 2.2、JavaServer Pages 1.1 対応とある。 コンパイル&リン クは概ね次のようである。Apache の中に Tomcat が組み込まれるのかと思ったら、 別サ −バとして動くようになっている。Tomcat 自体にも簡単なWWWサ−バが入っている。 1. JDK 1.2 を入れておく。 2. Apache を DSO 対応でコンパイルしておく。 3. Tomcat をコンパイルする。mod_jserv.so ができているのを確認。 4. mod_jserv.so を /usr/local/apache/libexec にコピ−する。 5. Apache の httpd.conf に Tomcat 分の設定を追加する。 6. Apache と Tomcat を起動する。 http://jakarta.apache.org/downloads/sourceindex.hmtl の "Release builds" を クリックし Tomcat 3.1、約 1.1 Mbytes の jakarta-tomcat.tar.gz を取ってきた。 % zcat jakarta-tomcat.tar.gz | tar xvf - % cd jakarta-tomcat; ls -F BUGS RELEASE-PLAN build.bat generatedocs.bat CVS/ RELEASE-PLAN-3.2 build.sh* generatedocs.sh* LICENSE STATUS.html build.xml proposals.tar README TODO build1.xml src/ RELEASE-INFO bin/ etc/ % ls -F src CVS/ build/ etc/ j2ee/ share/ tests/ admin/ doc/ examples/ native/ shell/ webpages/ servlet/ 以下にある Servlet のサンプル。 % ls -F src/examples ↓ WEB-INF/ jsp/ servlets/ -- CVS/Entries, CVS/Root, CVS/Tag, CVS/Template, CVS/ images/ index.html, cookies.html, helloworld.html, reqheaders.html, reqinfo.html, reqparams.html, sessions.html % ls -F src/examples/WEB-INF/classes CVS/ cal/ checkbox/ colors/ dates/ error/ examples/ num/ sessions/ HelloWorldExample.java CookieExample.java LocalStrings.properties LocalStrings_es.properties RequestHeaderExample.java RequestInfoExample.java RequestParamExample.java SessionExample.java SnoopServlet.java servletToJsp.java % ls -F etc CVS/ tomcat-iis-howto.html in-process-howto.html tomcat-netscape-howto.html todo.txt [ mod_jserv を探す ] Apache 用の Servlet API % find . -name mod_jserv.c -print << find src/ とすると src ディレクトリ以 .src/native/apache/jserv/mod_jserv.c 下をなめていく。 * Servlet プログラムの感じ ----------------------------------------- | |
a href="../servlet/HelloWorldExample" | となっていた。 要は呼び出せばいいので | ある。HelloWorldExample.java というプ |
ログラムのコンパイルした xxx.class が | 必要である。ここ Stest も Stest.class ファイルがないといけない。 Stest.java ----------------------------------------- |import javax.servlet.* ; |import javax.servlet.http.* ; |public class Stest extends HttpServlet { | | public void doPost( ... ) { << doGet, doPut というのもある。 | out.println( "" ); | out.println( "かとう" ); << HTML の記述を作って返す。 処理と HTML | | が混ざって見にくくなるのが欠点らしい。 | コネクト( Java RMI ); | コネクト( JDBC ); << CORBA/IIOP, HORB 等で他の Java プログ | out.println( "" ); ラムと通信する。 あるいは JDBC を使っ | } て Oracle などの RDBMS にアクセスする。 |} [ 他の Servlet 呼び出し ] 1. << Applet の呼び出しみたいな感じ。いろん な呼び出し方ができるということ。 2. * JSP プログラムの感じ test.jsp << PHP とよく似ている。<%! int i=0; %>は ------------------------------------- 大域変数みたいなもので、 アプリケ−シ | ョンサ−バが稼働中は、 ずっと変数が記 |<%! int i=0; %> 憶される。 これで買い物篭なんかが簡単 |<% out.println("

katou

"); %> に実現できる。他に <% page , <%= とい | うのもある。これらは Scriptlet という。 <%! .. の記述は Servlet でもできる。Servlet にはセッション管理のために、セッショ ン・トラッキングという機能があると雑誌に書いてあった。このことなのだろうか。 <%! はなかなか便利な機能である。Cookie を使わなくても、 セッション管理ができるのだか ら。JSP はかなり使いでがありそうである。Tomcat に入っているサンプルを、 じっくり 眺めて見たい。JSP プログラムの動きを少し説明しておく。ブラウザから test.jsp とア クセスする。するとアプリケ−ションサ−バの中で、 test.jsp はその時に一度コンパイ ルされ Servlet になる。後は JSP プログラムの記述が変更になるまで、Servlet として 稼働する。ブラウザからアクセスした結果は HTML ファイルで返される。PHP でのレスポ ンスに限界を感じてきたら、JSP を初めとするアプリケ−ションサ−バの出番となる。 * Servlet/JSP の参考 http://www.t3.rim.or.jp/~yoko-k-h/java/servlet/ > Servlet Engine いろいろ。この方ご婦人でサ−ブレットの本も出している。 http://www.dmz.hitachi-sk.co.jp/Java/Tech/servlet/ 日立ソフト > インタ−ネットビジネス推進部。Jserv, Tomcat の Apache 組込みの話などあり。 http://ash.or.jp/ash/java/servlet.html > Linux マシンに JSDK の Servlet 実行環境、Apache + JServ 組込みの話がある。 「月間ジャバワ−ルド」 `02/07, "JSPの活用法を探る"。IDGジャパン。 > 小生のとこは `02/04 から購読を始めた。今はまだいらんでも、これから Java はいる。 「Software Design」`02/10 の記事で紹介されていた Resin アプリケ−ションサ−バ。 > Servlet, JSP 対応。オ−プンソ−スのシェアウェア。 個人の非営利の利用はただ。 「Java による分散アプリケ−ション開発」 '99/12、2,800 税140 円、トッパン。 > ソケット通信、RMI、Servlet から EJB まで。自腹で購入して手元においてはいるが?。