SpringBoot实现动态定时任务
项目情况:
在当前项目中需要一个定时任务来清除过期的校验码,如果使用数据库存储过程的话不方便维护。因此采用springboot自带的方式来设置定时任务。
技术说明:
springboot自带的方式有两种可以实现:
一种是使用@scheduled注解的方式,只需要在启动类或者它所在的类上添加@enablescheduling注解允许执行定时任务,并且设置schecduled注解的参数,诸如:
1.cron是设置定时执行的表达式,如 0 0/5 * * * ?每隔五分钟执行一次
2.zone表示执行时间的时区
3.fixeddelay 和fixeddelaystring 表示一个固定延迟时间执行,上个任务完成后,延迟多长时间执行
4.fixedrate 和fixedratestring表示一个固定频率执行,上个任务开始后,多长时间后开始执行
5.initialdelay 和initialdelaystring表示一个初始延迟时间,第一次被调用前延迟的时间
示例代码如下:
package com.allcom.service; import com.allcom.dao.mysqldao; import org.springframework.beans.factory.annotation.autowired; import org.springframework.scheduling.annotation.scheduled; import org.springframework.stereotype.service; /** * @author: zy * @description: 定时任务 * @date: 2018/7/12_15:15 **/ @service public class taskservice { @autowired private mysqldao mysqldao; @scheduled(fixedrate = 5*1000) public void deleteinvalidcheckcode() { mysqldao.deleteinvalidcheckcode(); } }
另一种方式是通过自定义配置类的方式,步骤如下:
第一步:新建一个类实现schedulingconfigurer接口,并添加@configuration注解,@enablescheduling注解可以写在这里也可以写在启动类上,这里我写在了启动类上。
第二步: 重写configuretasks方法如下代码所示:
package com.allcom.task; import com.allcom.service.taskservice; import org.apache.ibatis.annotations.mapper; import org.apache.ibatis.annotations.select; import org.springframework.beans.factory.annotation.autowired; import org.springframework.context.annotation.configuration; import org.springframework.scheduling.trigger; import org.springframework.scheduling.triggercontext; import org.springframework.scheduling.annotation.schedulingconfigurer; import org.springframework.scheduling.config.scheduledtaskregistrar; import org.springframework.scheduling.support.crontrigger; import java.util.date; @configuration public class myscheduledtask implements schedulingconfigurer { @mapper public interface cronmapper { @select("select cron from user_cron limit 1") string getcron(); } @autowired @suppresswarnings("all") cronmapper cronmapper; @autowired @suppresswarnings("all") private taskservice taskservice; @override public void configuretasks(scheduledtaskregistrar scheduledtaskregistrar) { scheduledtaskregistrar.addtriggertask(new runnable() { @override public void run() { try { taskservice.deleteinvalidcheckcode(); //异步定时操作 } catch (exception e) { e.printstacktrace(); } } }, new trigger() { @override public date nextexecutiontime(triggercontext triggercontext) { string cron =cronmapper.getcron(); if("".equals(cron)||cron==null) return null; //定时任务触发,可修改定时任务的执行周期 crontrigger trigger=new crontrigger(cron); date nextexecdate= trigger.nextexecutiontime(triggercontext); return nextexecdate; } }); } }
第三步:启动项目,定时任务就自动添加了。
注意:这里我使用的是@mapper注解使用mybatis写了一个获取cron表达式的接口,可以从数据库中查询自定义表的cron字段值。这样的话项目运行的过程中,不用重新启动项目,只需要修改数据库中的字段值就可以动态的修改定时任务中的cron值,实现动态修改定时任务执行时间的功能。
但是,这种方式有一个缺点就是,将数据库cron字段值设为null或者“”以及不正确的值,这样定时任务就会停止执行,这样就算你下一次再给cron字段添加了正确的值,项目也不会执行定时任务了,这个时候就需要重新启动数据库才行。
这种方式适合于前台给几个特定的值给用户选择,不能让用户随便填。
附定时任务执行内容:
/** * @author: zy * @description: 删除用户过期的校验码 * @date: 2018/7/12_15:20 **/ @delete("delete from registinfo where id in (select id from (select id from registinfo where timestampdiff(minute,lastupdatetime,now()) >= 15)a )") void deleteinvalidcheckcode();
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。