假设我们有一台服务器,当前连接了3个客户端,并且每个客户端都运行很长时间。然后,我们使用以下命令关闭服务器:
curl -X POST localhost:port/shutdown
是否:
A)让服务器在关闭之前完成3个客户端正在运行的作业吗?
B)禁止发生任何其他连接,以使服务器最终关闭?
Spring Bootshutdown端点调用此类:在您的org.springframework.boot.actuate.endpoint.ShutdownEndpoint上调用。这反过来…close()``ApplicationContext
org.springframework.boot.actuate.endpoint.ShutdownEndpoint
close()``ApplicationContext
如果您的bean是已订购的并且已经精心编写了关闭方法,那么应该没问题。但是,如果没有,那么在该关闭周期的某个时刻“ 3个客户端正在运行的作业”可能会被中断。此外,可能在调用关闭和启动关闭周期之间的较小时间范围内建立新连接。
Spring提供了应用程序事件和侦听器挂钩,使您可以参与关闭周期。在ContextClosedEvent发布 之前, 豆类被破坏,嵌入式集装箱关机等,所以你可以使用这个默认的行为踢之前实现自己的关闭行为,例如:
ContextClosedEvent
public class ShutdownListener implements ApplicationListener<ContextClosedEvent> { @Override public void onApplicationEvent(ContextClosedEvent event) { // } }
您可以实现此监听器,使其
您以与在Spring Boot中注册任何ApplicationListener相同的方式注册此监听器,例如
SpringApplication app = new SpringApplication(MyApplication.class); app.addListeners(new ShutdownListener());