Tenho um aplicativo de console Spring Boot com tarefas agendadas por cron. Expressão do agendador obtida programaticamente (pode ser um arquivo JSON ou BD). Há uma verificação para a expressão do agendador e, se não for válida, não inicia a tarefa agendada
Aqui está um trecho de código:
@Service
public class DynamicScheduler implements SchedulingConfigurer {
private static final Logger _logger = LoggerFactory.getLogger(DynamicScheduler.class);
@Autowired
MyTask _myTask;
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(poolScheduler());
String triggerExpr = getExtressionFromExternal(); //From some source like JSON file or DB
if (canScheduleTask(triggerExpr)) {
taskRegistrar.addTriggerTask(() -> scheduleCron(triggerExpr), t -> {
CronTrigger crontrigger = new CronTrigger(triggerExpr);
return crontrigger.nextExecution(t);
});
}
else {
_logger.error("Cannot schedule execution");
}
}
private void scheduleCron(String cron) {
_myTask.run(); //execute code of the scheduled task
}
private boolean canScheduleTask(String triggerExpr) {
//Check if triggerExpr is valid
}
@Bean
public TaskScheduler poolScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setThreadNamePrefix("ThreadPoolTaskScheduler");
scheduler.setPoolSize(1);
scheduler.initialize();
return scheduler;
}
}
Atualmente, se a expressão cron não for válida, ela será executada com 0 tarefas agendadas. É possível, neste caso, sair graciosamente do aplicativo ou a única maneira possível de sair é lançando uma exceção?
No aplicativo Spring boot, há muitas maneiras de fechar o aplicativo. Uma dessas maneiras de fechar o aplicativo é via ConfigurableApplicationContext. Este objeto de classe ajudará a fechar o aplicativo Spring Boot e depois System.exit(0) ajudará a limpar o processo. Abaixo está o código que ajuda a parar o aplicativo.
Eu também sugeriria limpar outros recursos usando a anotação @PreDestroy no método e fazer a parte de limpeza.
O Spring Boot também oferece duas propriedades para desligamento suave.
Espero que isso ajude.