gpt4 book ai didi

java - Spring + jetty : graceful shutdown

转载 作者:太空宇宙 更新时间:2023-11-04 11:29:06 27 4
gpt4 key购买 nike

目标:拥有带有嵌入式 Jetty 的 Spring Web 应用程序,我想正常关闭/重新启动该应用程序。
这是 EmbeddedServletContainerFactory bean(如果需要,我将添加省略的代码):

@Bean
public EmbeddedServletContainerFactory jettyEmbeddedServletContainerFactory() {
JettyEmbeddedServletContainerFactory factory = new JettyEmbeddedServletContainerFactory();
factory.addServerCustomizers(server -> {

server.setStopAtShutdown(false);

/*
* StatisticsHandler has to be added for graceful shutdown to work (see
* https://github.com/eclipse/jetty.project/issues/1549#issuecomment-301102535)
*/
StatisticsHandler statisticsHandler = new StatisticsHandler();
statisticsHandler.setHandler(server.getHandler());
server.setHandler(statisticsHandler);
});
return factory;
}

这是我们的关闭信号处理程序:

@Component
public class ShutdownSignalHandler {

@Value("${shutdown.signalType:TERM}")
private String signal;

@Autowired
private ConfigurableApplicationContext context;

@Autowired
private Server jetty;

@PostConstruct
public void init() {
Signal.handle(new Signal(signal), this::signalHandler);
}

private void signalHandler(Signal signal) {
jetty.stop();
context.close();
}
}

问题:有了上述配置,每次我通过TERM信号重新启动应用程序时,我都会在apache_access日志中看到很多503条目(几乎所有这些都发生在jetty.stop执行时)。
知道它是如何/为什么发生以及解决方案是什么吗?

最佳答案

为什么/如何发生?这是 Jetty 的默认行为:首先,Jetty 关闭网络连接器以停止接受新连接,然后等待处理 Activity 请求。但问题是新的请求可能会通过已经建立的连接(在关闭过程开始之前连接的连接)发送到 Jetty。
解决方案:为通过开放连接发送的新请求发送重试响应。我们定制StatisticsHandler这样,在停止过程中,而不是使用 503 处理请求,它用 307 Connection: close, Location: <original-url> 处理它们.

更新:我们所做的是更改 handle 的实现StatisticsHandler的方法类(查找Change this line!评论):

@Override
public void handle(String path, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
...
try
{
Handler handler = getHandler();
if (handler!=null && _shutdown.get()==null && isStarted())
handler.handle(path, baseRequest, request, response);
else if (baseRequest.isHandled())
{
if (_wrapWarning.compareAndSet(false,true))
LOG.warn("Bad statistics configuration. Latencies will be incorrect in {}",this);
}
else
{
baseRequest.setHandled(true);
response.sendError(HttpStatus.SERVICE_UNAVAILABLE_503); // Change this line!
}
}
finally
{
...
}
}

关于java - Spring + jetty : graceful shutdown,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44003658/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com