突然 Tomcat の catalina.out にエラーが出力され始めたので調査しました。
どうやら、エラーになっているのは AXIS2 の Web アプリ。
Tomcat 停止時に SESSIONS.ser が見つからないと言っています。
今まで意識してませんでしたが、通常は work ディレクトリに作成されるようです。
この辺は、Tomcat の仕組みを理解しないといけないところですね。
SESSIONS.serの生成と破棄タイミング
SESSIONS.ser 自体は、Tomcat 停止時(stop)に作成されて、Tomcat 起動時(start)に削除されるようです。
最近やったことと言えば、ajp を使って Apache をフロントに使ったことだけですが、これと関係あるのかはまだわかりません。
(切り分けのためには Tomcat 単体での動作に戻してみる必要があります)
海外のサイトにこれと同じエラーについて論議されたスレッドがあるので、まずはそっちで手掛かりを掴んでみたいと思います。
(ただ、このサイト重い・・・)
エラーの詳細
以下は実際に出力されたエラーになります。
Tomcat のルートディレクトリは公開できないので下記では ${CATALINA_HOME} に書き換えています。
各アプリケーションのバージョンは、Tomcat が 5.5.25、Apache は 2.2.3 です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | [ERROR] 持続されたセッションの保存中のIOExceptionです: java.io.FileNotFoundException: ${CATALINA_HOME}/work/Catalina/localhost/axis2/SESSIONS.ser (No such file or directory) java.io.FileNotFoundException: ${CATALINA_HOME}/work/Catalina/localhost/axis2/SESSIONS.ser (No such file or directory) at java.io.FileOutputStream.open(Native Method) at java.io.FileOutputStream.<init>(FileOutputStream.java:179) at java.io.FileOutputStream.<init>(FileOutputStream.java:70) at org.apache.catalina.session.StandardManager.doUnload(StandardManager.java:489) at org.apache.catalina.session.StandardManager.unload(StandardManager.java:463) at org.apache.catalina.session.StandardManager.stop(StandardManager.java:667) at org.apache.catalina.core.StandardContext.stop(StandardContext.java:4360) at org.apache.catalina.core.ContainerBase.removeChild(ContainerBase.java:893) at org.apache.catalina.startup.HostConfig.undeployApps(HostConfig.java:1180) at org.apache.catalina.startup.HostConfig.stop(HostConfig.java:1151) at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:313) at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120) at org.apache.catalina.core.ContainerBase.stop(ContainerBase.java:1055) at org.apache.catalina.core.ContainerBase.stop(ContainerBase.java:1067) at org.apache.catalina.core.StandardEngine.stop(StandardEngine.java:448) at org.apache.catalina.core.StandardService.stop(StandardService.java:510) at org.apache.catalina.core.StandardServer.stop(StandardServer.java:734) at org.apache.catalina.startup.Catalina.stop(Catalina.java:602) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.apache.catalina.startup.Bootstrap.stop(Bootstrap.java:307) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.apache.commons.daemon.support.DaemonLoader.stop(DaemonLoader.java:200) [ERROR] 永続記憶装置にセッションをアンロード中の例外です java.io.FileNotFoundException: ${CATALINA_HOME}/work/Catalina/localhost/axis2/SESSIONS.ser (No such file or directory) at java.io.FileOutputStream.open(Native Method) at java.io.FileOutputStream.<init>(FileOutputStream.java:179) at java.io.FileOutputStream.<init>(FileOutputStream.java:70) at org.apache.catalina.session.StandardManager.doUnload(StandardManager.java:489) at org.apache.catalina.session.StandardManager.unload(StandardManager.java:463) at org.apache.catalina.session.StandardManager.stop(StandardManager.java:667) at org.apache.catalina.core.StandardContext.stop(StandardContext.java:4360) at org.apache.catalina.core.ContainerBase.removeChild(ContainerBase.java:893) at org.apache.catalina.startup.HostConfig.undeployApps(HostConfig.java:1180) at org.apache.catalina.startup.HostConfig.stop(HostConfig.java:1151) at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:313) at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120) at org.apache.catalina.core.ContainerBase.stop(ContainerBase.java:1055) at org.apache.catalina.core.ContainerBase.stop(ContainerBase.java:1067) at org.apache.catalina.core.StandardEngine.stop(StandardEngine.java:448) at org.apache.catalina.core.StandardService.stop(StandardService.java:510) at org.apache.catalina.core.StandardServer.stop(StandardServer.java:734) at org.apache.catalina.startup.Catalina.stop(Catalina.java:602) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.apache.catalina.startup.Bootstrap.stop(Bootstrap.java:307) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.apache.commons.daemon.support.DaemonLoader.stop(DaemonLoader.java:200) |
エラーの原因と対応
少しずつ原因を切り分けながら進めていったところ、AXIS2-1.3 から AXIS2-1.2 に戻したら現象が出なくなりました。
ちなみに、現在の work ディレクトリ配下は以下の通り。
1 2 3 4 5 6 | $ ls -l ${CATALINA_HOME}/work/Catalina/localhost/axis2/ axis218639addressing-1.2.mar axis218640soapmonitor-1.2.mar axis218641XXXXX.aar axis218642XXXXX.aar tldCache.ser |
やはり、Tomcat とアプリケーションの組み合わせで発生していたようです。
現在はフロントの Apache からは ajp は使っていませんが、ajp に切り替えてみてそのパターンも見ておこうと思います。
ちなみに現在は ProxtPass で Tomcat の 8080 に直接リクエストを委譲しています。