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集群上运行应用程序并进行会话故障转移。 默认情况下,会话可以是粘性的,当一个节点关闭时,健康节点会选择会话,而这一切对最终用户来说都是透明的。