SpringBoot实现动态定时任务

SpringBoot实现动态定时任务

这篇文章主要为大家详细介绍了跳羚实现动态定时任务,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

项目情况:

在当前项目中需要一个定时任务来清除过期的校验码,如果使用数据库存储过程的话不方便维护。因此采用跳羚自带的方式来设置定时任务。

技术说明:

跳羚自带的方式有两种可以实现:

一种是使用@已安排注解的方式,只需要在启动类或者它所在的类上添加@启用调度注解允许执行定时任务,并且设置Schecduled注解的参数,诸如:

1.cron是设置定时执行的表达式,如0 0/5 * * * ?每隔五分钟执行一次

2 .区域表示执行时间的时区

3 .固定延迟和固定延迟字符串表示一个固定延迟时间执行,上个任务完成后,延迟多长时间执行

4 .固定汇率和fixedRateString表示一个固定频率执行,上个任务开始后,多长时间后开始执行

5 .初始延迟和初始延迟字符串表示一个初始延迟时间,第一次被调用前延迟的时间

示例代码如下:

包com。所有com。服务;

导入com。所有com。道。mysqldao

导入org。spring框架。豆子。工厂。注释。自动连线;

导入org。spring框架。日程安排。注释。预定;

导入org。spring框架。刻板印象。服务;

/**

* @作者:zy

* @描述:定时任务

* @日期:2018/7/12_15:15

**/

@服务

公共类任务服务{

@自动连线

私有MysqlDao mysqlDao

@Scheduled(fixedRate=5*1000)

public void deleteInvalidCheckCode(){

mysqldao。deleteinvalidcheckcode();

}

}

另一种方式是通过自定义配置类的方式,步骤如下:

第一步:

新建一个类实现计划配置器接口,并添加@配置注解,@启用调度注解可以写在这里也可以写在启动类上,这里我写在了启动类上。

第二步:

重写配置任务方法如下代码所示:

包com。所有com。任务;

导入com。所有com。服务。任务服务;

导入org。阿帕奇。伊巴提斯。注释。映射器;

导入org。阿帕奇。伊巴提斯。注释。选择;

导入org。spring框架。豆子。工厂。注释。自动连线;

导入org。spring框架。语境。注释。配置;

导入org。spring框架。日程安排。触发器;

导入org。spring框架。日程安排。触发上下文;

导入org。spring框架。日程安排。注释。调度配置器;

导入org。spring框架。日程安排。配置。scheduledtaskregistrar

导入org。spring框架。日程安排。支持。cron触发器;

导入Java。util。日期;

@配置

公共类我的计划任务实现调度配置器{

@Mapper

公共接口克隆映射程序{

@ Select( Select cron from user _ cron limit 1 )

string getCron();

}

@自动连线

@SuppressWarnings(all )

克隆映射程序克隆映射程序;

@自动连线

@SuppressWarnings(all )

私有任务服务

@覆盖

公共void配置任务(计划任务注册器计划任务注册器){

计划任务注册器。addtriggertask(new Runnable(){

@覆盖

公共无效运行(){

尝试{

taskservice。deleteinvalidcheckcode();//异步定时操作

} catch(异常e) {

e。printstacktrace();

}

}

},新触发器(){

@覆盖

public Date nextExecutionTime(触发器上下文触发器上下文){

字符串cron=cron mapper。getcron();

如果()。equals(cron)||cron==null)

返回空

//定时任务触发,可修改定时任务的执行周期

cron trigger触发器=新cron触发器(cron);

date nextExecDate=trigger。nextexecutiontime(触发上下文);

返回nextExecDate

}

});

}

}

第三步:

启动项目,定时任务就自动添加了。

注意:这里我用@Mapper注释写一个接口用Mybatis获取cron表达式,可以从数据库中查询自定义表的cron字段值。这样,在项目运行过程中,不需要重启项目,只需要修改数据库中的字段值就可以动态修改调度任务中的cron值,从而实现动态修改调度任务执行时间的功能。

但这种方法有一个缺点,就是将数据库中cron字段的值设置为null或" ",一个不正确的值将会停止计划任务的执行,这样即使下次给cron字段添加正确的值,项目也不会执行计划任务,此时需要重新启动数据库。

这种方法适合前台给用户几个具体值选择,用户不能随便填。

附加到预定任务执行内容:

/**

* @作者:zy

* @Description:删除用户过期的校验码。

* @日期:2018/7/12_15:20

**/

@ Delete( Delete FROM regist info WHERE id in(SELECT id FROM(SELECT id FROM regist info WHERE timestamp diff(MINUTE,lastupdatetime,NOW())=15)a))

void deleteInvalidCheckCode();

这就是本文的全部内容。希望对大家的学习有帮助,支持我们。

SpringBoot实现动态定时任务