2009-08-04

APR を使って Tomcat で Comet

Tomcat で Comet を実装するには NIO か APR コネクタを使う必要があります。NIO を用いる方法はいろんなところで説明されているのでここでは APR コネクタを使う方法についてだけ書きます。Tomcat のバージョンは 6.0.20、APR の開発ライブラリは Debian (Lenny) の libapr1-dev バージョン 1.2.12-5 を使っています。


# aptitude install libapr1-dev
# su - tomcat
$ cd ${CATALINA_HOME}/bin
$ tar zxf tomcat-native.tar.gz
$ cd tomcat-native-1.1.16-src/jni/native
$ ./configure --prefix=${CATALINA_HOME}/apr --with-apr=/usr/bin/apr-config --with-ssl=yes
$ make
$ make install

インストールが終わると以下のようなメッセージが表示されます。

----------------------------------------------------------------------
Libraries have been installed in:
   ${CATALINA_HOME}/apr/lib

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the `LD_RUN_PATH' environment variable
     during linking
   - use the `-Wl,--rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------

メッセージではいくつかの方法がありますが、最初に挙げられている LD_LIBRARY_PATH 環境変数に APR ライブラリのディレクトリを追加する方針にしました。APR コネクタを使うか使わないかは setenv.sh に追加した行をコメントアウトする・しないで切り替えることができます。


$ cd ${CATALINA_HOME}
$ bin/shutdown.sh  # Tomcat が動作している場合のみ
$ echo "export LD_LIBRARY_PATH=${CATALINA_HOME}/apr/lib:\${LD_LIBRARY_PATH}" >> bin/setenv.sh
$ bin/startup.sh


catalina.out に出力される起動ログを見比べてみると…

変更前

2009/08/04 15:36:06 org.apache.catalina.core.AprLifecycleListener init
情報: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /usr/local/java/jdk1.6.0_14/jre/lib/amd64/server:/usr/local/java/jdk1.6.0_14/jre/lib/amd64:/usr/local/java/jdk1.6.0_14/jre/../lib/amd64:/usr/java/packages/lib/amd64:/lib:/usr/lib
2009/08/04 15:36:06 org.apache.coyote.http11.Http11Protocol init
情報: Coyote HTTP/1.1を http-8080 で初期化します
2009/08/04 15:36:06 org.apache.catalina.startup.Catalina load
情報: Initialization processed in 471 ms
--- (snip) ---
2009/08/04 15:36:08 org.apache.coyote.http11.Http11Protocol start
情報: Coyote HTTP/1.1を http-8080 で起動します
2009/08/04 15:36:08 org.apache.jk.common.ChannelSocket init
情報: JK: ajp13 listening on /0.0.0.0:8009
2009/08/04 15:36:08 org.apache.jk.server.JkMain start
情報: Jk running ID=0 time=0/14  config=null
2009/08/04 15:36:08 org.apache.catalina.startup.Catalina start


変更後

2009/08/04 16:00:28 org.apache.catalina.core.AprLifecycleListener init
情報: Loaded APR based Apache Tomcat Native library 1.1.16.
2009/08/04 16:00:28 org.apache.catalina.core.AprLifecycleListener init
情報: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
2009/08/04 16:00:28 org.apache.coyote.http11.Http11AprProtocol init
情報: Coyote HTTP/1.1を http-8080 で初期化します
2009/08/04 16:00:28 org.apache.coyote.ajp.AjpAprProtocol init
情報: Initializing Coyote AJP/1.3 on ajp-8009
2009/08/04 16:00:28 org.apache.catalina.startup.Catalina load
情報: Initialization processed in 562 ms
--- (snip) ---
2009/08/04 16:01:02 org.apache.coyote.http11.Http11AprProtocol start
情報: Coyote HTTP/1.1を http-8080 で起動します
2009/08/04 16:01:02 org.apache.coyote.ajp.AjpAprProtocol start
情報: Starting Coyote AJP/1.3 on ajp-8009
2009/08/04 16:01:02 org.apache.catalina.startup.Catalina start


APR コネクタが使われていることがわかります。

Tomcat の examples の中にある org.apache.catalina.CometProcessor を実装している ChatServlet にアクセスしてみるときちんと (?) 動作していることがわかります。って、この ChatServlet はまだ実装途中? あんまりきちんとは動いてなさそうです…。