2017-05-16 85 views
1

目标:使用嵌入式Jetty的Spring Web应用程序,我想关闭/重新启动应用程序。
这里的EmbeddedServletContainerFactory豆(如果需要的话,我会添加省略代码):Spring + Jetty:优雅的关机

@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正在执行)。
任何想法如何/为什么会发生和决议是什么?

回答

1

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

UPDATE:我们所做的是改变StatisticsHandler类的handle方法的实现(查找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 
    { 
     ... 
    } 
} 
+0

也许你可以在这里发布你的StatisticsHandler-customization? –

+1

@MarkusSchulte我添加了需要修改的部分。这不是特别的。我只是改变了我们想要的东西。只是一个快速的评论:由于处理流程复杂,我没有试图扩展它。我复制了整个代码并更改了实现。 – Rad

-1

503 - 服务不可用

Apache可以不进行代理请求到servlet容器的时候,因为没有servlet容器监听的主机上得到响应:端口代理配置中指定。

+1

我们没有任何Apache。谢谢。 – Rad

+0

我虽然自从你提到“很多在apache_access日志中的503个条目” – ootero

+0

那么这是Jetty日志处理程序使用的名称。 – Rad