###写在前面的
在项目开发中定时任务是一种常用的功能,比如应用中每天进行的一次数据分析,或者每隔一段时间进行一次权限验证等,这类功能的实现一般都是使用定时任务。使用定时任务简化了我们开发这类功能的逻辑,不用编写开始执行时间的逻辑,只有编写执行内容的逻辑,是开发更便捷。
###一、定时任务的实现方式简述
######(1)使用jre自带的java.util.Timer类和java.util.TimerTask类实现定时任务
这种方式来实现定时任务过程稍显复杂,而且timerTask 也是实现了 java.lang.Runnable 接口的,所以事实上timerTask 就是一类线程,而且这类线程的调度还不可控,容易出现差错。这种方式的定时任务在日常开发中很少使用,所以在这里就不过多介绍。
######(2)使用Spring的task实现定时任务
这种定时任务的实现方式是在Spring3.0以后才提供的,Spring提供的这个功能可以看做是一个轻量级的Quartz,配合Spring使用比较简单便捷。
######(3)使用Quartz实现定时任务
Quartz是OpenSymphony组织的一个开源项目,它是一个功能强大的任务调度器,可以与J2EE与J2SE应用程序相结合也可以单独使用。
由于Quart功能强大所以使用起来也比较复杂,本人对Quart还没有深入学习,目前还不能谈太多
###二、使用@Scheduled创建定时任务
创建一个定时任务类,示例如下
@EnableScheduling
@Configuration
public class MyTask {
private static Logger logger = Logger.getLogger(MyTask.class.getName());
//corn 是定时任务表达式
//corn 表达式共七项分别代表
//秒 分 时 日 月 星期 年(可选)
//想了解更多corn表达式可以自行查阅资料
@Scheduled(cron = "0/2 * * * * *")
public void task(){
logger.info(new Date()+"task");
}
}
在这里要说明的是:Spring提供的定时任务的执行时间是根据程序所运行的操作系统的时间来调度,而且时间间隔的计算是从0开始。
解释从0开始的含义------例如corn= ( 0/5 * * * * *)代表是每隔5秒执行一次,假如程序在00:00:02秒时启动成功,按照我们思维下次执行时间应该为07秒,12秒,17秒…,其实实际并不是这样,这里是从0开始划分,下次执行时间为05秒,10秒,15秒…
###三、使用SchedulingConfigurer接口实现定时任务
代码示例如下
@EnableScheduling
@Configuration
public class MyTaskCorn implements SchedulingConfigurer {
private static Logger logger = Logger.getLogger(MyTaskCorn.class.getName());
private static String corn = "0/2 * * * * *";
public static boolean changeCorn(String corn){
//在此处可以做corn表达式校验
if(corn==null||"".equals(corn.trim())){
return false;
}
MyTaskCorn.corn = corn;
return true;
}
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
Runnable task = new Runnable() {
@Override
public void run() {
logger.info(new Date()+"----MyTaskCorn");
}
};
Trigger trigger = new Trigger() {
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
CronTrigger cronTrigger = new CronTrigger(corn);
return cronTrigger.nextExecutionTime(triggerContext);
}
};
scheduledTaskRegistrar.addTriggerTask(task,trigger);
}
}
这种方式的好处是可以在程序的运行中修改corn的值,从而改变任务的执行计划,同时也可以动态的添加任务。