我有2台服务器。 服务器A有一个cron系统,它给出了触发器要求,通过servlet调用服务器B
在服务器B中,当接收服务器A的呼叫时,我在HttpSession上存储了几个信息,然后我开始一个新的线程,所以我可以释放服务器A.
我发现,思想日志,在某些情况下,当服务器B中的线程到达HttpSession时,之前设置的值是不同的。它们不是空的或空白的,它们具有实际值,但不是我所放置的值。
服务器A每5分钟发出30次通知。这意味着我将有几个并发线程。
为什么HttpSession会被另一个线程覆盖?
答案 0 :(得分:0)
Servlet Specification v 3.0的2.3.3.4节说,
如果应用程序创建的线程使用容器管理的 对象,例如请求或响应[或会话]对象,这些对象 必须只能在对象的生命周期[...]内访问。
HttpSession
对象肯定是容器管理的对象,但Servlet规范没有明确定义它们的生命周期。但是,似乎有理由认为,当会话无效时,生命周期结束,无论是明确地还是超时,并且没有任何属于该会话的请求正在被服务。在此之后,如果您继续访问会话对象,则所有投注都将关闭。特别是,允许容器缓存和重用托管对象,包括会话对象。
如果您的服务器A没有参与会话跟踪,那么每个请求都将分配给一个新会话,并且每个请求的生命周期将是一个超时期限。在这种情况下,您可以考虑将[default]超时设置得足够长,以确保会话在一次计算过程中不会超时(但请参见下文)。另一方面,如果您的服务器A 参与会话跟踪,那么会话对象将在每个请求上打开以进行修改。
服务器A是否参与会话跟踪,但是,对于应用程序线程(例如您手动启动以访问容器管理对象的应用程序线程),它是一种糟糕的形式。最好使用不同的机制向他们提供数据。