一、前言
今天实现了一个要按每天凌晨4点自动拉取数据库数据到文件的需求用到了spring的定时任务,有些不记得了,重新查询资料复习了一下,记录下。
二、关于spring的定时任务---注解方式
spring的定时任务已经封装的很简单了,一种使用注解的方法简单配置一下就可以实现。这里有用到@EnableSchedulding用来表示开启定时任务放在要实现定时业务代码的类上,其次定时任务有三种方式实现
在要实现业务代码的方法上使用@Scheduled,主要用到的参数有三个分别如下
1、@Scheduled(cron = "* 20 18 * * ?") 表示每天下午18点20分执行
例如:
@Scheduled(cron = "0 20 18 * * ?")
public void test_1(){
System.out.println("我是定时任务现在的时间是:"+new Date());
}
cron 的字符串有些规则,一般来讲有7个参数,从左至右分别为 秒 分 时 日 月 星期 年
用 * 表示每的意思 ,?表示不确定的意思,比如上例 “ 0 20 18 * * ?” 就是星期几不确定,因为日与星期几都写的话就会冲突,所以总要有一个不确定,同理也可以写为 “ 0 20 18 ? * *” 这样写的意思是一样的,也是表示每天下午18点20分执行。最后一个参数年可用省略不写,留空即可
2、@Scheduled(fixedDelay = 1000) 表示该任务执行完后每间隔1秒继续执行
例如:
@Scheduled(fixedDelay = 1000)
public void test_2(){
//表示该任务执行完后间隔1秒钟后再次执行
System.out.println("我是定时任务fixedDelay-现在的时间是:"+new Date());
}
这种定时任务方式的参数的单位是以毫秒,是等方法内的业务代码执行完毕间隔一定时间才继续执行。
3、@Scheduled(fixedRate = 1000) 表示该任务每隔1秒就执行一次,不论当前任务是否执行完毕
例如:
@Scheduled(fixedRate = 1000)
public void test_3(){
//表示每间隔1秒执行一次该方法,不论当前任务是否执行完毕
System.out.println("我是定时任务fixedRate-现在的时间是:"+new Date());
}
参数单位毫秒,这一种就是间隔一定时间就会执行,不会等当前任务执行完毕
以上就是三种实现方法。当然实现类同样要被spring所管理才行,在类上可用加@Component注解
三、关于spring的定时任务----实现SchedulingConfigurer接口
1、可用创建一个定时任务类,实现SchedulingConfigurer接口即可。
例如:
package com.feilonkji.application.utils;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import java.util.Date;
/**
* @title: ScheduldTest_1
* @Description: 实现定时任务的另一种方式,通过实现SchedulingConfigurer接口
* @Author zr
* @Date:2020/9/21 18:54
* @Version 1.8
*/
@Configuration
@ComponentScan(value = "com.feilonkji.application.utils")
@EnableScheduling
public class ScheduldTest_1 implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
scheduledTaskRegistrar.addFixedRateTask(new Runnable() {
@Override
public void run() {
//通过实现SchedulingConfigurer接口实现定时任务
//每间隔1秒执行一次
System.out.println("我是另一种定时任务-现在的时间是"+new Date());
}
},1000);
//另一种,还有其他几种就省略了
scheduledTaskRegistrar.addTriggerTask(new Runnable() {
@Override
public void run() {
System.out.println("我是新的定时任务");
}
}, new Trigger() {
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
//定时任务触发,可修改定时任务的执行周期,每2秒执行一次
CronTrigger trigger = new CronTrigger("*/2 * * * * ?");
Date nextExecDate = trigger.nextExecutionTime(triggerContext);
return nextExecDate;
}
});
}
}
四、任重道远、学无止境