任务调度总结
1.定时任务概述
在项目的开发当中有三种方式来解决定时任务,分别是JDK自带的Timer,Spring Task和第三方组件Quartz.
三者的特点为Timer为JDK自带的,简单易用,但是满足不了复杂的情况,所以很少使用。Spring Task 使用简单,支持注解和配置文件两种格式。Quartz功能强大但是笨重
2.JDK实现任务调度
/**
* 基于jdk的任务调度
*/
public class JdkTaskDemo {
public static void main(String[] args) {
//创建定时类
Timer timer = new Timer();
//创建任务类
TimerTask task = new TimerTask() {
@Override
public void run() {
System.out.println("定时任务执行了......"+ LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
}
};
//执行定时任务
timer.schedule(task,new Date(),2000);
}
}
3.Spring-task实现任务调度
3.1 入门案例
使用Spring-task不需要任何另外的依赖,只需要导入
spring-boot-starter-web即可
在启动类当中打开任务调度注解即可
@SpringBootApplication
@EnableScheduling
public class TaskStudyApplication {
public static void main(String[] args) {
SpringApplication.run(TaskStudyApplication.class, args);
}
}
3.2 Cron表达式
关于 cronExpression 表达式有至少 6 个(也可能是 7 个)由空格分隔的时间元素。从左至右,这些元素的定义如下:
1.秒(0–59)
2.分钟(0–59)
3.小时(0–23)
4.月份中的日期(1–31)
5.月份(1–12 或 JAN–DEC)
6.星期中的日期(1–7 或 SUN–SAT)
7.年份(1970–2099)
0 0 10,14,16 * * ?
每天上午 10 点,下午 2 点和下午 4 点
4.Quartz
4.1Quartz介绍
相较于Timer,Quartz增加了很多功能
持久性作业-就是保持调度定时的状态;
作业管理-对调度作业进行有效的管理;
Quartz的核心类有三个部分
- 任务 Job : 需要实现的任务类,实现
execute()
方法,执行后完成任务。 - 触发器 Trigger : 包括
SimpleTrigger
和CronTrigger
。 - 调度器 Scheduler : 任务调度器,负责基于
Trigger
触发器,来执行 Job任务。
4.2案例
需要导入相应的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
创建一个任务类
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("任务被执行了");
}
}
创建调度器、jobDetail实例j和trigger实例
public class QuartzTest {
public static void main(String[] args) throws SchedulerException {
//1.创建任务调度器
SchedulerFactory factory = new StdSchedulerFactory();
Scheduler scheduler = factory.getScheduler();
//2.创建JobDetail实例,并与MyJob类绑定
JobDetail job = JobBuilder.newJob(MyJob.class)
//指定任务名,组名
.withIdentity("job1","group1")
.build();
//3.构建Trigger实例,每隔3s执行一次
Trigger trigger = TriggerBuilder.newTrigger()
//指定触发器名字,组名
.withIdentity("trigger1","group1")
//从现在触发
.startNow()
//触发规则3s触发一次
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(3).repeatForever())
.build();
//4.执行 开启任务调度器
scheduler.scheduleJob(job,trigger);
System.out.println(System.currentTimeMillis());
scheduler.start();
}
}