【问题标题】:Spring Boot: exception while exiting applicationSpring Boot:退出应用程序时出现异常
【发布时间】:2016-06-26 10:57:25
【问题描述】:

我想运行一个在完成工作后应该退出的 Spring 应用程序。但在我的实现中,我得到了一个例外。

build.gradle 包含:

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web") {
        exclude module: "spring-boot-starter-tomcat"
    }
}

Application.java:

@SpringBootApplication
public class Application {

    @Autowired
    private ApplicationContext context;

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @PostConstruct
    public void doTheWorkAndExit() {
        // do the work ...
        SpringApplication.exit(context, () -> 0);
    }

}

我得到了异常

Exception thrown from LifecycleProcessor on context close

java.lang.IllegalStateException: LifecycleProcessor not initialized - call 'refresh' before invoking lifecycle methods via the context: org.springframework.context.annotation.AnnotationConfigAppl
icationContext@1807f5a7: startup date [Fri Mar 11 10:03:27 CET 2016]; root of context hierarchy
    at org.springframework.context.support.AbstractApplicationContext.getLifecycleProcessor(AbstractApplicationContext.java:415)
    at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:975)
    at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:934)
    at org.springframework.boot.SpringApplication.close(SpringApplication.java:1252)
    at org.springframework.boot.SpringApplication.exit(SpringApplication.java:1238)
    at mypackage.Application.doTheWorkAndExit(Application.java:34)
    ...

我能做什么?有没有比使用System.exit(0) 更好的解决方案?

【问题讨论】:

  • 我认为你不能从@PostConstruct 阶段的应用程序中exit 因为在这个阶段Spring Context 没有被初始化。因此,请尝试使用 ApplicationListener<ContextRefreshedEvent> 运行您的工作,在这种情况下,应用程序必须正常退出,因为 Context 已刷新(初始化)。

标签: java spring spring-boot


【解决方案1】:

在您的Application.class 中,您可以实现CommandLineRunner 接口。

@SpringBootApplication
public class Application implements CommandLineRunner{}

实现后需要实现一个void方法run()

@Override
public void run(String... strings) {
    //here starts your code (like in a normal main method in a java application)
}

应用程序在执行完所有代码后关闭。


完整的Application.class

@SpringBootApplication
public class Application implements CommandLineRunner{

  @Override
  public void run(String... strings) {
      //here your code...
  }

  public static void main(String[] args) throws Exception {
      SpringApplication.run(Application.class, args);    
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 2019-04-23
    • 2018-05-17
    • 2020-06-24
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    相关资源
    最近更新 更多