2017-08-15 71 views
4

这是一个后续问题How to shutdown a Spring Boot Application in a correct way? 使用Spring Boot执行器安全关闭其他服务器?

假设我们有一个服务器有3个客户端当前连接,并且每个客户端运行一个长时间的工作。然后,我们用关机命令的服务器:

curl -X POST localhost:port/shutdown 

这是否:

A)让系统完成了3个客户端关闭之前运行的作业?

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

回答

4

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

  • 破坏豆
  • 关闭bean工厂
  • 停止嵌入式servlet容器

如果豆类是有序的,并已精心编写的关闭方法那么这应该是精细。但是,如果没有,那么在该关机周期的某个时刻,“3个客户正在运行的作业”可能会被中断。此外,它是可能的新的连接可能会在你调用关机和停机循环踢。

Spring提供了应用程序事件和事件监听钩子,让你参加关机周期之间的小时间窗口中进行。该ContextClosedEvent发表以前豆被破坏,嵌入式集装箱关机等,所以你可以使用这个默认的行为踢之前实现自己的关闭行为,例如:

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

您可以实现这个监听器使得它

  • 暂停(如果你不与HTTP请求处理或东西相当于),以允许任何进行中的工作完成后再继续
  • 不合格品的连接请求用HTTP 503与关机周期

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

SpringApplicatiom app = new SpringApplication(MyApplication.class); 
app.addListeners(new ShutdownListener()); 
+0

“破豆”是什么意思? –

+1

@JoseMartinez这意味着关闭它们或丢弃它们。使用术语“销毁”是因为Spring允许你定义一个'destroy-method',它将保证在应用程序上下文关闭时代表你调用。 – glytching

+0

如何以编程方式拒绝所有连接? –