到目前为止,我发现了什么
*)旁注: 尽管我们的容器入口点是[“ /opt/tomcat/bin/catalina.sh”,“ run”],但是 在catalina.sh中,通过bash buildin“ exec”命令启动Java进程, 因此Java进程替换了 Shell进程,从而成为新的进程ID 1。 (我可以通过exec在运行的容器中进行验证,并在其中进行“ ps aux”。) 顺便说一句,我正在使用Tomcat 7.0.88。
我发现默认情况下有关tomcat进行宽容关闭的语句(http://tomcat.10.x6.nabble.com/Graceful-Shutdown-td5020523.html-“任何正在进行的连接都将完成”),但是我所看到的只是从docker发送到Java进程结果的SIGTERM几乎不会停止正在进行的请求。
我写了一个小小的servlet来测试这种行为:
import javax.ws.rs.*;
import javax.ws.rs.core.*;
import javax.ws.rs.core.Response.Status;
@Path("/")
public class SlowServerRes
{
@GET
@Produces(MediaType.TEXT_PLAIN)
@Path("test1")
public Response test1(@QueryParam("sleep") final int sleepDurationSec)
{
long received = System.currentTimeMillis();
System.out.println("+++++++++++++++++++++ received request at " + received);
for (int i=1; i <= sleepDurationSec; i++) {
System.out.println(" ++++ Sleeping for 1 sec ("+i+")");
try { Thread.sleep(1000); }
catch (InterruptedException e) {
System.out.println(" Sleep was interrupted at second " + i + " ... ignoring/continue sleeping.");
}
}
long finished = System.currentTimeMillis();
String result = "received: " + received + " finished: " + finished;
System.out.println("+++++++++++++++++++++ " + result);
Response response = Response.status(Status.OK).entity(result).build();
return response;
}
}
经过严格的谷歌搜索后,我终于遇到了这个帖子: http://grokbase.com/t/tomcat/users/113nayv5kx/tomcat-6-graceful-shutdown
因此,给tomcat的宽限期不会作为servlet的宽限期传播。 我想知道天气是否有意义,但事实就是如此。 因此,使Servlet能够正确结束其正在进行的请求的唯一方法是更改 “ unloadDelay”(https://tomcat.apache.org/tomcat-7.0-doc/config/context.html)。
但是,我没有在tomcat配置文件中找到正确的位置来定义非默认的unloadDelay。如果这很重要,我主要关心的是球衣servlet(org.glassfish.jersey.servlet.ServletContainer)。
或者也许还有其他可能性,我现在看不到?
(我在标签列表中添加了kubernetes,因为这可能是对kubernets尤其重要的问题,因为它经常重新定位(docker stop-> SIGTERM)容器,只是为了保持负载平衡。)
答案 0 :(得分:1)
现在我在这里找到了答案:https://stackoverflow.com/a/11154770/2081279
它在
的Linux下为我工作<Context path="/myapp" unloadDelay="10000"/>
但仅带大写字母“ C”的文字。
答案 1 :(得分:0)
您可以公开REST API来正常停止服务器。
1)实现并使用一个javax过滤器,该过滤器将正在进行的HTTP请求保持在自己的状态。
2)随着stop事件的发生,当前的tomcat实例不必再服务任何新的客户端请求。因此,请确保新请求不能重定向到该实例。
3)随着stop事件的发生(第二件事),启动一个线程,等待所有请求得到处理。发送所有响应后,请请求tomcat实例关闭:the command String shutdown may be a way。