定时任务:创建静态定时任务、动态定时任务

定时任务有三种实现
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 在线表达式

猜你喜欢

转载自blog.csdn.net/qq_41767337/article/details/89400854