天天看点

定时任务 -注解/触发器(dev和数据库配置)

一、@Scheduled使用

值写在启动配置文件中,application-dev.yml里

定时任务 -注解/触发器(dev和数据库配置)

1、使用方式1

值直接取得dev里面的值,如果dev里面不配则会报错

@Component
public class BatchRecTaskHandler {

    @Scheduled(initialDelay = 0L, fixedRateString = "${fpsMsg.switch.task.recBatchTime}")
    public void recBatchRecHandler() {
        // 定时任务逻辑
    }
}
           

2、使用方式2

值取得是@Value里面的值,也是取得dev的值,但是dev可以不配,则默认使用值20000L也不报错

@Component
public class BatchRecTaskHandler {
    @Value("${fpsMsg.switch.task.recBatchTime:20000L}")
    private Long recBatchTime;
    private Long processingRecBatchInfCurrentInterval = 0L;

    @Scheduled(fixedRate = 1000L)
    public void recBatchRecHandler() {
        // 不生效,直接结束
        if (processingRecBatchInfCurrentInterval < recBatchTime) {
            processingRecBatchInfCurrentInterval += 1000L;
            return;
        }
        processingRecBatchInfCurrentInterval = 0L;
        
        // 生效执行定时任务逻辑
    }
}
           

二、定时任务cron存在数据库中

如下图

定时任务 -注解/触发器(dev和数据库配置)

代码如下(抽象类及实现类)

抽象类

@Configuration
@EnableScheduling
public abstract class AbstractTaskConfig implements SchedulingConfigurer {
    private static final Logger logger = LoggerFactory.getLogger(AbstractTaskConfig.class);
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addTriggerTask(//执行定时任务
                () -> {
                    processTask();
                }, //设置触发器
                triggerContext -> {
                    // 初始化定时任务周期
                    CronTrigger trigger = new CronTrigger(getCron());
                    //CronTrigger trigger = new CronTrigger("* * 1 * * ?");
                    return trigger.nextExecutionTime(triggerContext);
                });
    }
    /**
     * @brief 任务的处理函数
     * 本函数需要由派生类根据业务逻辑来实现
     */
    protected abstract void processTask();


    /**
     * @return String
     * @brief 获取定时任务周期表达式
     * 本函数由派生类实现,从配置文件,数据库等方式获取参数值
     */
     abstract String getCron();
}
           

实现类

@Configuration
public class FpsMsgRecTaskConfig extends AbstractTaskConfig{
    private static final Logger logger = LoggerFactory.getLogger(FpsMsgRecTaskConfig.class);

    @Override
    protected void processTask() {
        SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        logger.info( " 开始任务"+ ",开始时间:" + sd.format(new Date()));
        // TODO: 定时任务的逻辑
        logger.info( " 结束任务" + ",结束时间:" + sd.format(new Date()));
    }

    @Override
    String getCron() {
        return null;
        // 从数据库取合适的定时任务 如取得0 0/1 * * * ?
        // return fileTaskInfoDao.get("x").getTaskTimeCrontab();
    }
}
           

核心,取数据库数据:

定时任务 -注解/触发器(dev和数据库配置)