I've an application that run a task that parses a file and persist the data in the database. After that it shutsdown gracefully.
I can see that spring automatically creates 4 tables and populates them with data.
Tables that spring creates:
task_execution
task_execution_params
task_lock
task_task_batch
Im not really interested in these tables and would like spring to stop create them. Is this possible? or am I using spring task wrong..
I've already tried:
spring.cloud.task.initialize-enabled
spring.cloud.task.autoconfiguration.enabled
and they didn't really do what I want.
Thank you.
Persisting the task status in the database is one of the core features of Spring Cloud Task. If you don't need that, you most likely don't need Spring Cloud Task.
If you have the web dependency on the classpath (e.g. for the actuators), the application will only stop when the embedded web server is stopped. If the web server has been started by Spring, a good way to do this here is to close the application context, which takes care of the rest.
If your task is executed from an ApplicationRunner
, you can listen for the ApplicationReadyEvent
that is only sent after all runners have finished. In the listener for this event you can then close the application context.
This could roughly look like this:
@SpringBootApplication
public class DemoApplication {
private static final Logger LOG = LoggerFactory.getLogger(DemoApplication.class);
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Bean
ApplicationRunner applicationRunner() {
return args -> LOG.info("Hello Task");
}
@Component
static class ShutdownWhenReadyListener implements ApplicationContextAware, ApplicationListener<ApplicationReadyEvent> {
private ConfigurableApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
context = (ConfigurableApplicationContext) applicationContext;
}
@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
context.close();
}
}
}
For very simple apps, you can also close the application context directly from main as the method run
will only return after the context is fully booted which includes all ApplicationRunners
to have run:
@SpringBootApplication
public class DemoApplication {
private static final Logger LOG = LoggerFactory.getLogger(DemoApplication.class);
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args).close();
}
@Bean
ApplicationRunner applicationRunner() {
return args -> LOG.info("Hello Task");
}
}