【发布时间】: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