spring-boot - 发生异常时强制 Spring Boot 应用程序退出
问题描述
我有一个 Spring Boot 命令行应用程序,它应该在容器中运行一次,然后退出(每 10 分钟一次)。
我最初遇到了一个问题,因为即使正确执行后它也不会退出。我通过注入上下文并exit
用它调用来修复它:
@SpringBootApplication
@Slf4j
public class EmailKpiTrackerApplication implements CommandLineRunner {
private final EmailKpiTracker emailKpiTracker;
private final ConfigurableApplicationContext context;
public EmailKpiTrackerApplication(EmailKpiTracker emailKpiTracker, ConfigurableApplicationContext context) {
this.emailKpiTracker = emailKpiTracker;
this.context=context;
}
public static void main(String[] args) {
SpringApplication.run(EmailKpiTrackerApplication.class, args).close();
}
@Override
public void run(String... args) throws Exception {
emailKpiTracker.recordNewProcessedEmails();
System.exit(SpringApplication.exit(context));
}
}
但是我还有一个问题:如果应用程序无法启动,那么它就不会退出。JVM 继续运行,容器没有关闭。
如何强制 Spring Boot 应用程序退出,无论是成功运行还是在运行期间出现重大问题?
谢谢
解决方案
这不是太难..但也不明显。我通过捕获异常并强制在 finally 块中退出来修复它:
@SpringBootApplication
@Slf4j
public class EmailKpiTrackerApplication implements CommandLineRunner {
private final EmailKpiTracker emailKpiTracker;
private final ConfigurableApplicationContext context;
public EmailKpiTrackerApplication(EmailKpiTracker emailKpiTracker, ConfigurableApplicationContext context) {
this.emailKpiTracker = emailKpiTracker;
this.context=context;
}
public static void main(String[] args) {
SpringApplication.run(EmailKpiTrackerApplication.class, args).close();
}
@Override
public void run(String... args) throws Exception {
try {
emailKpiTracker.recordNewProcessedEmails();
}
catch(Exception e){
log.error("problem running the application",e);
}
finally {
System.exit(SpringApplication.exit(context));
}
}
}
推荐阅读
- r - r - 将 dplyr::group_by 与 purrr::pmap 结合使用
- html - Bootstrap 3.3.7 折叠按钮问题(不起作用)
- django - 通过 Django 在主页播放视频
- r - 如何处理 R markdown 中的空单元格?
- javascript - 将 Node js 与 Stripe 集成
- swift - 更改部分索引背景颜色
- c# - C# - 更改 MailItem 的返回路径
- html - 在不使用 CSS Grid 或 flexbox 的情况下,如何在容器中完美地居中网格?
- python - 我正在尝试使用 Python 在 Web 浏览器中显示 MySQL 查询
- c++ - winapi中哪个函数检查按钮是否正在关闭控制台?