I want to run a Spring application that should exit after it has done its work. But in my implementation I get an exception.
build.gradle
contains:
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);
}
}
I get the exception
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)
...
What can I do? Is there a better solution than using System.exit(0)
?
In your Application.class
you can implement CommandLineRunner
interface.
@SpringBootApplication
public class Application implements CommandLineRunner{}
After implementation you need to implement a void method run()
@Override
public void run(String... strings) {
//here starts your code (like in a normal main method in a java application)
}
The application shuts down after excecuting all of the code.
The complete 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);
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With