Axe*_*ine 91 java spring spring-boot
如何在不终止VM的情况下以编程方式关闭Spring Boot应用程序?
在其他作品中,与之相反
new SpringApplication(Main.class).run(args);
Run Code Online (Sandbox Code Playgroud)
Sot*_*lis 92
关闭SpringApplication基本上意味着关闭基础ApplicationContext.该SpringApplication#run(String...)方法将您ApplicationContext作为一个ConfigurableApplicationContext.你可以close()自己做吧.例如,
@SpringBootApplication
public class Example {
public static void main(String[] args) {
ConfigurableApplicationContext ctx = SpringApplication.run(Example.class, args);
// ...determine it's time to shut down...
ctx.close();
}
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用static SpringApplication.exit(ApplicationContext, ExitCodeGenerator...)辅助方法为您执行此操作.例如,
@SpringBootApplication
public class Example {
public static void main(String[] args) {
ConfigurableApplicationContext ctx = SpringApplication.run(Example.class, args);
// ...determine it's time to stop...
int exitCode = SpringApplication.exit(ctx, new ExitCodeGenerator() {
@Override
public int getExitCode() {
// no errors
return 0;
}
});
// or shortened to
// int exitCode = SpringApplication.exit(ctx, () -> 0);
System.exit(exitCode);
}
}
Run Code Online (Sandbox Code Playgroud)
sno*_*lli 55
在Spring启动应用程序中,您可以使用类似的东西
ShutdownManager.java
import org.springframework.context.ApplicationContext;
import org.springframework.boot.SpringApplication;
@Component
class ShutdownManager{
@Autowired
private ApplicationContext appContext;
public void initiateShutdown(int returnCode){
SpringApplication.exit(appContext, () -> returnCode);
}
}
Run Code Online (Sandbox Code Playgroud)
ACV*_*ACV 31
这项工作,甚至完成印刷.
SpringApplication.run(MyApplication.class, args).close();
System.out.println("done");
Run Code Online (Sandbox Code Playgroud)
所以加入.close()之后run()
说明:
public ConfigurableApplicationContext run(String... args)运行Spring应用程序,创建并刷新新的ApplicationContext.参数:
args- 应用程序参数(通常从Java main方法传递)返回: 正在运行的ApplicationContext
和:
void close()关闭此应用程序上下文,释放实现可能包含的所有资源和锁.这包括销毁所有缓存的单例bean.注意:不在父上下文上调用close; 父语境有自己独立的生命周期.可以多次调用此方法而不会产生副作用:将忽略对已经关闭的上下文的后续关闭调用.
所以基本上,它不会关闭父上下文,这就是VM不退出的原因.
这将确保 SpringBoot 应用程序正确关闭并将资源释放回操作系统,
@Autowired
private ApplicationContext context;
@GetMapping("/shutdown-app")
public void shutdownApp() {
int exitCode = SpringApplication.exit(context, (ExitCodeGenerator) () -> 0);
System.exit(exitCode);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
78795 次 |
| 最近记录: |