这篇文章主要为大家详细介绍了跳羚实现动态定时任务,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
项目情况:
在当前项目中需要一个定时任务来清除过期的校验码,如果使用数据库存储过程的话不方便维护。因此采用跳羚自带的方式来设置定时任务。
技术说明:
跳羚自带的方式有两种可以实现:
一种是使用@已安排注解的方式,只需要在启动类或者它所在的类上添加@启用调度注解允许执行定时任务,并且设置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();
这就是本文的全部内容。希望对大家的学习有帮助,支持我们。