SpringBoot应用程序的关闭目前总结起来有4种方式:
- Rest接口:使用spring-boot-starter-actuator模块里的ShutdownEndpoint
- SpringApplication的exit静态方法:直接调用该静态方法即可
- JMX:使用SpringBoot内部提供的MXBean
- 使用第三方进程管理工具
Rest接口
Rest接口使用Endpoint暴露出来,需要引入spring-boot-starter-actuator这个stater。
这个关闭应用程序对应的Endpoint是ShutdownEndpoint,直接调用ShutdownEndpoint提供的rest接口即可。得先开启ShutdownEndpoint(默认不开启),以及不进行安全监测:
1 | endpoints.shutdown.enabled: true |
然后调用rest接口:
1 | curl -X POST http://localhost:8080/shutdown |
可以使用spring-security进行安全监测:
1 | endpoints.shutdown.sensitive: true |
然后使用用户名和密码进行调用:
1 | curl -u admin:admin -X POST http://127.0.0.1:8080/shutdown |
这个ShutdownEndpoint底层其实就是调用了Spring容器的close方法:
1 |
|
SpringApplication的exit静态方法
SpringApplication提供了一个exit静态方法,用于关闭Spring容器,该方法还有一个参数exitCodeGenerators表示ExitCodeGenerator接口的数组。ExitCodeGenerator接口是一个生成退出码exitCode的生成器。
1 | public static int exit(ApplicationContext context, |
我们写个Controller直接调用exit方法:
1 |
|
JMX
spring-boot-starter-actuator这个stater内部会构造ShutdownEndpointMBean。
使用jconsole可以看到这个MBean:
SpringBoot内部也提供了一个SpringApplicationAdminMXBean,但是需要开启:
1 | spring.application.admin.enabled: true |
使用第三方进程管理工具
比如我们的应用程序部署在linux系统上,可以借助一些第三方的进程管理工具管理应用程序的运行,比如supervisor。
设置program:
1 | [program:stop-application] |
使用supervisorctl进入控制台操作应用程序:
1 | status |