Friday, June 08, 2007

Web アプリケーションにおけるコンテクスト間通信

crossContext 属性は、getContext() で取得する側を true に設定する。そうしないと、null が返る。

共通するクラスは WEB-INF/lib/ や WEB-INF/classes/ においては駄目。ClassCastException が発生する。Tomcat5 ではそういうクラスは、CATALINA_HOME/shared/lib/ や CATALINA_HOME/shared/classes/ に置けとある。Tomcat4 だと CATALINA_HOME/lib/ か CATALINA_HOME/classes/ に置けとあったがうまくいかなかった。見つけられずに NoClassDefFoundError が発生する。そこで、CATALINA_HOME/common/lib/ に置いたらうまくいった。

http://tomcat.apache.org/tomcat-4.0-doc/class-loader-howto.html
http://www.jajakarta.org/tomcat/tomcat5.0/ja/docs/tomcat-docs/class-loader-howto.html
http://www-06.ibm.com/jp/software/websphere/developer/j2ee/strategy/


http://www.fortunefield.com:8080/StoreSide/Store?data=fuckYou
http://www.fortunefield.com:8080/LoaderSide/Loader

$CATALINA_HOME/shared/lib/ を有効に使えるのは、$CATALINA_HOME/webapps/ に war ファイルを置いた場合のみのようだ。ただ、これだと crossContext 属性を設定できないので、コンテクスト間通信には使えない。。。

Thursday, June 07, 2007

Web アプリケーションのコンテクストパスを多重化する方法はあるか?

webapp1 という Web アプリケーションがあるとしよう。Tomcat ならば、CATALINA_HOME/webapps/ に webapp1.war というファイルがあるものとする(むろん、配備の仕方はこれ以外にもあるが)。

このとき、

http://www.fortune.com/webapp1/SomethingServlet

のようなパスでこの Web アプリにアクセスできる。これに /packman というコンテクストパスでもアクセスできるようにするには、CATALINA_HOME/webapps/ に次のような内容の XML フラグメントファイルをおけばいい。


<?xml version="1.0" encoding="EUC-JP" ?>
<!--
ファイル名は packman.xml でも hoge.xml でも何でもいい。
-->
<Context path="/packman" docBase="./webapp1.war"
debug="0" privileged="true">
</Context>


こうしてから、

http://www.fortune.com/packman/SomethingServlet

によるアクセスが成功する。ただし、この方法には重大な欠陥がある。これだと、webapp1 というアプリケーションが二重に起動されてしまうのだ。つまり、アプリケーションのインスタンスが2つできてしまう

一方の Web アプリから他方の Web アプリにリクエストを転送することで1つの Web アプリを共用化することはできる。ただ、いろいろ調べてみたが、Unix のシンボリックリンクのようにパスを多重化しつつ、ファイルの実体は1つだけにするというようなことはできないようだ。

検索をかけてみると、日本語のページはヒットしなかったが、英語では1つだけヒットした。

How to configure multiple context path for a webapps