在温和使用后,Tomcat会随着AbstractProtocol暂停而随机关闭

时间:2011-11-11 00:17:25

标签: java hibernate spring tomcat log4j

运行我的webapp一段时间后(时间因小时和天而异,具体取决于流量)Tomcat似乎随机关闭了自己。在这种情况发生之前,日志中没有任何异常(没有例外)只是我的应用程序发出的正常INFO内容。

任何人都可以帮忙解决这个问题的最佳方法吗? Tomcat中有什么东西可以触发AbstractProtocol pause信号吗?

日志:

09-Nov-2011 21:40:19 org.apache.coyote.AbstractProtocol pause
INFO: Pausing ProtocolHandler ["http-bio-80"]
09-Nov-2011 21:40:20 org.apache.coyote.AbstractProtocol pause
INFO: Pausing ProtocolHandler ["ajp-bio-8009"]
09-Nov-2011 21:40:21 org.apache.catalina.core.StandardService stopInternal
INFO: Stopping service Catalina

Java版本:1.6.0_25-b06 Tomcat版本:6

4 个答案:

答案 0 :(得分:5)

我之前见过这种情况,日志有时候会很神秘。我确实注意到你在端口80上运行(这是另一个问题)让我相信你修改了你的server.xml。如果服务器上有多个tomcat实例,请确保它们都具有唯一的关闭端口。标准端口是8005,如果多个实例正在同一端口上侦听,则可以将它们都关闭。

您的代码或杠杆库中可能存在随机的System.exit(),或者您在代码中不正确地抑制了真正的错误消息。我已经多次看到人们在控制器中将其写为错误处理的一种形式:

try {
  // Do something
} catch(Exception e) {
  // No rethrowing or logging, just suppressing
}

这可以防止真正的错误冒泡甚至正确记录。

我还看到tomcat服务器在达到内存限制时就会停止运行。日志中的某处会出现堆空间错误,但出于某种原因,我发现它很容易被埋没,剩下的就是暂停消息。除了catalina.out之外,查看localhost.log可能是值得的。那里的垃圾通常较少。

答案 1 :(得分:2)

如果您正在使用生产箱或想要快速/临时修复,那么您可能希望将server.xml中的关闭端口设置为" -1",这将禁用shutdown命令。这不会让其他可能具有相同关闭端口的应用程序向您的tomcat实例发送关闭信号。 但是使用此设置,您将不得不杀死tomcat而不是关闭它。这是不好的部分。

答案 2 :(得分:2)

我们的tomcat神秘地关闭,因为我们的自定义脚本启动了原始startup.sh(没有nohup)并继续做一些耗时的事情。 调用自定义脚本的人使用ctrl-Z将其放入后台然后关闭putty终端。这将SIGHUP发送到连接到终端的所有进程,并且tomcat被关闭。

希望tomcat打印出关于接收SIGHUP的消息。 我们后来发现这个链接证实了我们的分析。

http://solveissue.com/note?id=1767204

答案 3 :(得分:0)

当logrotate向Apache进程发送“kill -HUP”并且Apache已经生成Tomcat时,我们遇到了这个问题:Apache会在收到HUP信号时终止所有子进程。