在Tomcat关闭期间保持HTTP请求

时间:2015-03-26 10:16:12

标签: java tomcat servlets tomcat7 shutdown

我遇到Tomcat关机问题。请求到达时的请求 关闭servlet容器似乎被连接器阻止 直到集装箱关闭完毕。

问题是,我们的servlet可能需要一分钟才能关闭,这意味着 在此期间抵达的连接将保留最多一分钟。

此行为是否正确/预期?

理想的Tomcat关闭行为不是

  1. 让现有的请求 完成(就像它已经做的那样),但是
  2. 拒绝新连接(而不是 接受并持有他们)?

3 个答案:

答案 0 :(得分:5)

显然,您不是唯一注意/评论此行为的人;看到这个“tomcat-user”帖子:

(事实上,该帖子和您的问题之间的相似之处表明您和Andry Eng之间存在某种联系......)

很明显,从某种意义上说,这是“预期的”行为。

是否“正确”是一个意见问题。如果Tomcat开发人员不同意你的看法,那就没有实际意义了。

而且,对于它的价值,在这里发表关于“理想”行为的修辞问题也没有实际意义。显然,Tomcat开发人员要么不在StackOverflow /“tomcat-users”中闲逛......要么他们不愿意讨论这个问题。


那么你有什么可能的解决方案?

  • 此关联的问答解释了一种解决方法 - How to process servlet requests during long shutdown

  • 您可以在Tomcat问题跟踪器上打开一个问题。问题在于,您的问题可能会在发布之前的几个月或几年内出现在列表中。或者它可能被“解雇”。

    但是,过去似乎没有人提交过这个问题。

  • 您可以弄清楚如何修改Tomcat以在关机期间拒绝新请求。然后将您的(已测试)更改作为补丁提交。

  • 你可以聘请某人为你做这项工作。例如,请查看此处列出的人员/组织:http://wiki.apache.org/tomcat/SupportAndTraining

答案 1 :(得分:2)

这是正确的行为。只要服务器在给定端口处启动,客户端就会发送请求。

只要启动,服务器就会接受请求。因此,将收到在关机过程中收到的一些请求,但不会完全处理。

如果要优雅地处理这些请求,则需要实现自己的机制。您可以使用JMS队列或过滤器。第一个请求接收过滤器将首先存储(db / serialize)请求然后处理它。稍后当服务器重新启动时,您可以检查未处理的请求,您可以处理它们或通知客户端它失败了。

答案 2 :(得分:1)

这不是理想的行为。当关闭它应该停止接受新的连接,但我想在实现它时存在一些技术挑战。不管怎么说,Moot,如上所述。

我们如何克服它:

  1. 我们的tomcats前面有网络服务器。如果你不这样做,那就做好这个计划,是我的建议。
  2. 有办法告诉Web服务器从其循环实例列表中删除一个节点(tomcat实例)。
  3. 3-4分钟后,tomcat节点应该是空闲的(没有新连接和旧连接完成)。我们有一个基于http://www.quickserver.org/的自定义Web服务器,它允许后端tomcats在进程连接中完成,但是不再给它提供新的。
  4. 维护时,我们在代理上有另一项服务,将tomcat添加回活动服务器的Web服务器列表。
  5. 在我们的案例中,我们有办法告诉服务器重新加载他们的配置。其他服务器似乎具有相同的https://serverfault.com/questions/108261/how-to-make-modification-take-affect-without-restart-nginx