1. 程式人生 > 實用技巧 >spring boot 定時任務

spring boot 定時任務

/**
 * 定時任務
 */
@Component
@EnableScheduling
public class DynamicScheduleTask implements SchedulingConfigurer {

    private static Logger logger = LoggerFactory.getLogger(DynamicScheduleTask.class);

    @Autowired
    private CreditCodeMstDao creditCodeMstDao;

    /**
     * 執行定時任務
     * @param taskRegistrar
     */
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {

        taskRegistrar.addTriggerTask(
                // 新增任務內容
                () -> {
                    logger.info("執行動態定時任務: " + LocalDateTime.now().toLocalTime());
                },
                // 設定執行週期
                triggerContext -> {
                    CreditCodeMst codeMst = new CreditCodeMst();
                    codeMst.setCdType(PublicEnums.cronType.planTask.getKey());
                    codeMst.setCdId(PublicEnums.cronType.planTask.getValue());
                    CreditCodeMst task = creditCodeMstDao.queryByPrimaryKey(codeMst);

                    // 預設規則,防止定時失效
                    String cron = "0/5 * * * * ?";

                    // 格式校驗
                    if(task != null && CronExpression.isValidExpression(task.getCdName())) {
                        // 動態配置
                        cron = task.getCdName();
                    }else {
                        logger.error("定時任務表示式異常,使用預設配置: " + cron);
                    }

                    // 返回執行週期
                    return new CronTrigger(cron).nextExecutionTime(triggerContext);
                }
        );
    }
}