Tomcat会话意外到期

我们正在运行处理超过100个并发会话的tomcat应用程序服务器。 在过去的两个月中,最活跃的用户注意到他们有时会从系统中被踢出。

据我所知,日志tomcat会话没有任何理由过期。

我认为Web应用程序方面没有任何问题。 tomcat方面有什么问题吗?

Tomcat 6.0.18。

如果没有代码机会触发这个,我会看一下内存使用情况。 这可能是Tomcat耗尽内存并使会话无效以进行恢复的结果。

如果可能的话监视垃圾收集,和/或用jconsole或jvisualvm进行监视。

可能的原因是您在会话中放入了一个不实现Serializable接口的对象。 Tomcat偶尔会在磁盘上写一些会话。 如果一个会话包含不可序列化的对象,它将被简单地从容器中删除(因为NotSerializableException)。 如果发生这种情况,您应该在tomcat日志文件中看到Exception。

我会特别增加对服务器和会话的监控。

一个好的监控应用程序是lambda探针 – 它允许您查看当前会话及其数据。 我还会添加一个HttpSessionListener来记录会话创建和销毁。

编辑

是否有可能向会话添加一些非可序列化的对象,而Tomcat无法将它们钝化到磁盘?

编辑2

Lambda探测似乎已经死了,在http://code.google.com/p/psi-probe/上有一个更好的项目分支

存在超时,您可以在web.xml中进行配置:

 ...  -1   

使用-1表示没有超时

增加会话记录,这可能会解决您的问题。

Tomcat配置页面的Tomging in Tomcat包含一个增加会话日志记录的示例。

我们刚刚遇到tomcat 6_0_18和ibm 1.5 jvm

原来这是一个primefaces操作的ibm jvm问题。

大于6_0_19的tomcats有一个修复来处理它。

它也不会发生在太阳1.5 jvm

这里有一些更多的细节

tomcat bugzilla案

当存在以下先决条件时,我遇到过类似的问题:

  • 跨多个JVM安装了多个tomcat应用程序实例
  • 未正确配置负载平衡(Web服务器和Tomcat JVM之间)。
  • Tomcat的会话复制function启用

由于负载均衡配置不正确,Web服务器可能会随机决定中断会话关联,并将传入请求发送到之前从未见过会话的Tomcat JVM。 Tomcat JVM将发出新会话,用户将丢失所有先前的会话数据并有效地重新开始。

您可以搜索Tomcat的错误数据库,但最好再次查看您的Web应用程序。 Tomcat出现问题的可能性非常低。

尝试调查导致会话失效的原因。 你在使用filter吗? 你有跨上下文请求吗? 尝试为每个请求添加日志记录信息,以确定何时会话丢失。

虽然我不知道问题的原因,但是一个可能的修复(我在之前的项目中已经完成)将是在tomcat集群上运行应用程序并进行会话故障转移。 默认情况下,会话可以是粘性的,当一个节点关闭时,健康节点会选择会话,而这一切对最终用户来说都是透明的。