概述
定时任务有三种实现
1 jdk自带的定时任务
2 Quartz插件实现的定时任务,需要引入额外的包
3 SpringTask定时调度,是对jdk的再一次封装,不用引入其他包了,用spring的包就自带
SpringTask有3种实现定时任务的方式
1 注解实现(静态定时任务)
通过3个注解
@Scheduled:配置在具体的定时任务方法上,并配置时间表达式
@EnableScheduling:配置在启动类上,就是SpringBootApplication类上
@Component:配置在具体的定时任务类上,将该类注册为一个组件
实现:
1.1 在SpringBootApplication的启动类上加注解@EnableScheduling
1.2 创建一个定时任务类
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Date;
//将该定时任务类注册为一个组件
@Component
public class MyTask {
//cron = "0/5 * * * * ? "是时间表达式
//@Scheduled5秒执行一次taskTest方法
@Scheduled(cron = "0/5 * * * * ? ")
public void taskTest(){
System.out.println(new Date());
}
}
执行结果
2 通过xml实现(静态定时任务,就是将注解换成了xml中的标签)
3 动态添加定时任务
动态添加用线程池里的任务调度机制
3.1 动态添加则不在使用注解,如果下面3个注解有的话就注释,没有的话直接配置动态定时任务
@Scheduled
@EnableScheduling
@Component
3.2
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;
//将该类注册为组件
@Component
public class MyTaskUtil {
//注入线程池的调度任务类
@Autowired
ThreadPoolTaskScheduler threadPoolTaskScheduler;
//创建一个时间表达式方法
public void addTask(String cron){
//用触发器new一个时间表达式,创建的构造方法的入参就是时间表达式
Trigger trigger=new CronTrigger(cron);
//将触发任务放在线程池的任务调度里(第二个参数),第一个参数是定时任务要执行的目标类
threadPoolTaskScheduler.schedule(new TaskRunnable(),trigger );
}
}
3.3
创建一个类(该类就是真正要执行的定时任务)实现多线程Runnable接口,并且重写run方法
import java.util.Date;
public class TaskRunnable implements Runnable{
@Override
public void run(){
System.out.println(new Date());
}
}
3.4
controller里
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyTask {
//注入工具类,就是定时任务的类
@Autowired
MyTaskUtil taskUtil;
@RequestMapping("/addTask")
//传入参数,与下一行的时间表达式做拼接,参数传入几就是几秒执行一次目标任务
//threadPoolTaskScheduler实例调用schedule方法就是创建执行任务
public void addTask(String cron){
String s="0/"+cron+" * * * * ? ";
//调用执行定时任务的方法
taskUtil.addTask(s);
}
}
请求地址:http://127.0.0.1:8080/addTask?cron=5
可以同时创建多个定时任务,在本任务没有停止的情况下请求
http://127.0.0.1:8080/addTask?cron=3 就是又创建了一个定时任务
动态定时任务的创建步骤
1 创建一个线程池任务调度的bean
@Autowired
ThreadPoolTaskScheduler threadPoolTaskScheduler;
2 实现一个多线程的接口(Runnable),并重写run方法,作为目标被执行
public class TaskRunnable implements Runnable{
@Override
public void run(){
System.out.println(new Date());
}
}
3 创建定时触发器trigger
Trigger trigger=new CronTrigger(cron);
4 任务调度器执行任务:触发器、定时目标
threadPoolTaskScheduler.schedule(new TaskRunnable(),trigger );
静态定时器、动态定时器使用场景不同,没有好坏之分
cron表达式,其结构是:
从左到右(用空格隔开):秒 分 小时 月份中的日期 月份 星期中的日期 年份
表达式常见例子
每隔5秒执行一次:*/5 * * * * ?
每隔1分钟执行一次:0 */1 * * * ?
每天23点执行一次:0 0 23 * * ?
每天凌晨1点执行一次:0 0 1 * * ?
每月1号凌晨1点执行一次:0 0 1 1 * ?
每月最后一天23点执行一次:0 0 23 L * ?
每周星期天凌晨1点实行一次:0 0 1 ? * L
在26分、29分、33分执行一次:0 26,29,33 * * * ?
每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?
http://qqe2.com/cron/index 在线表达式
最后
以上就是昏睡钢笔为你收集整理的定时任务:创建静态定时任务、动态定时任务的全部内容,希望文章能够帮你解决定时任务:创建静态定时任务、动态定时任务所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复