使用Spring Boot执行器安全关闭休息服务器?

时间:2017-08-15 19:43:38

标签: java spring rest spring-mvc spring-boot

这是How to shutdown a Spring Boot Application in a correct way?

的后续问题

假设我们有一台服务器,当前连接了3个客户端,并且每个客户端都运行很长的工作。然后,我们使用以下命令关闭服务器:

curl -X POST localhost:port/shutdown

那样:

A)让服务器在关闭之前完成3个客户端正在运行的作业?

B)禁止发生任何其他连接,以便服务器最终关闭?

1 个答案:

答案 0 :(得分:7)

Spring Boot关闭端点调用此类:org.springframework.boot.actuate.endpoint.ShutdownEndpoint,在close()上调用ApplicationContext。这反过来......

  • 销毁豆子
  • 关闭bean工厂
  • 停止嵌入式servlet容器

如果您的bean已经订购并且已经仔细编写了关闭方法,那么这应该没问题。但如果没有,那么在关闭周期的某个时刻" 3个客户正在运行的工作"可能会被打断。此外,您可能会在调用关闭和关闭周期之间的小时间窗口中建立新连接。

Spring提供了应用程序事件和侦听器挂钩,允许您参与关闭周期。 {<1}}在销毁之前发布,嵌入式容器已关闭等,因此您可以在默认行为开始之前使用此实现自己的关闭行为。例如:< / p>

ContextClosedEvent

您可以实现此侦听器

  • 拒绝使用HTTP 503的连接请求(或等同于您未处理HTTP请求的情况)
  • 暂停以允许任何空中作业完成,然后再继续关闭周期

您注册此侦听器的方式与在Spring Boot中注册任何ApplicationListener的方式相同,例如

public class ShutdownListener implements ApplicationListener<ContextClosedEvent> {
    @Override
    public void onApplicationEvent(ContextClosedEvent event) {
        // 
    }
}