首页 > 解决方案 > 发生异常时强制 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 应用程序退出,无论是成功运行还是在运行期间出现重大问题?

谢谢

标签: 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));
    }
  }
}

推荐阅读