我有 Spring Boot 控制台应用程序,其中有按 cron 任务安排的任务。调度程序表达式以编程方式获取(可以是 JSON 文件或 DB)。对调度程序表达式进行检查,如果无效,则不会启动计划任务
以下是一段代码:
@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;
}
}
目前,如果 cron 表达式无效,它将运行并安排 0 个任务。在这种情况下,是否可以正常退出应用程序,或者退出的唯一可能方式是通过抛出异常?
在 Spring Boot 应用程序中,有很多方法可以关闭应用程序。关闭应用程序的一种方法是通过 ConfigurableApplicationContext。此类对象将有助于关闭 Spring Boot 应用程序,然后 System.exit(0) 将有助于清理进程。以下是有助于停止应用程序的代码。
我还建议使用方法上的@PreDestroy 注释来清理其他资源并执行清理部分。
Spring boot 还提供了 2 个属性用于正常关闭。
希望这会有所帮助。