Quzrtz是OpenSymphony开源组织在Job scheduling领域的开源项目
特点:Quartz具有丰富特性的"任务调度库",能够集成于任何的Java应用,小到独立的应用,大到电子商业系统。quartz能够创建亦简单亦复杂的调度,执行上万的任务,任务Job被定义为标准的Java组件,支持JTA事务、集群。
pom.xml
<dependencies>
<dependency>
<groupId>org.quartz-schedulergroupId>
<artifactId>quartzartifactId>
<version>2.3.0version>
dependency>
<dependency>
<groupId>org.quartz-schedulergroupId>
<artifactId>quartz-jobsartifactId>
<version>2.3.0version>
dependency>
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-log4j12artifactId>
dependency>
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.17version>
dependency>
dependencies>
测试类
package com.kiki.quartz.job;
import cn.hutool.core.date.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @author kiki
* @date 2023/7/2
* @description
*/
@Slf4j
public class HelloJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
//输出当前时间的任务
Date date = new Date();
//业务
log.info("正在进行数据库的备份工作,备份数据库的时间是:"+ SimpleDateFormat.getDateInstance().format(new Date()));
System.out.println("正在进行数据库的备份工作,备份数据库的时间是:"+ DateUtil.now());
}
}
package com.kiki.quartz.domain;
import com.kiki.quartz.job.HelloJob;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
/**
* @author kiki
* @date 2023/7/2
* @description
*/
public class HelloSchedulerDemo {
public static void main(String[] args) throws Exception{
//1.调度器Scheduler,从工厂中获取调度的实例
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
//2.任务实例JobDetail,加载任务类,与HelloJob完成绑定
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
.withIdentity("job1","group1")//任务组
.build();
//3.触发器Trigger
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1","group1")//触发器组
.startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatSecondlyForever(5))
.build();
//关联任务和触发器,保证按照触发器定义的条件执行任务
scheduler.scheduleJob(jobDetail,trigger);
//启动
scheduler.start();
}
}
(1)使用Map获取
(2)Job实现类中添加setter方法对应JobDataMap的键值,Quartz框架默认的JobFactory实现类在初始化job实例对象时会自动调用这些setter方法。
注意:如果遇到 同名的key,Trigger中的usingJobData(“message”,“simple触发器”)会覆盖JobDetail中的.usingJobData(“message”,“打印日志”)。
@PersistJobDataAfterExecution注解的使用(多次调用Job的时候,会对Job进行持久化,即会保存数据的信息)
有状态的Job可以理解为多次Job调用期间可以持有一些状态信息,这些状态信息存储在JobDataMap中,而默认的无状态Job每次调用时会创建一个新的JobDataMap。
Quartz有一些不同的触发器类型,不过,用得最多的是SimpleTrigger和CronTrigger
(1)JobKey
(2)startTime
(3)endTime
package com.kiki.quartz.domain;
import com.kiki.quartz.job.HelloJob;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import java.util.Date;
/**
* @author kiki
* @date 2023/7/2
* @description
*/
public class HelloSchedulerDemoTrigger {
public static void main(String[] args) throws Exception{
//1.调度器Scheduler,从工厂中获取调度的实例
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
//设置任务的开始结束时间
Date startDate = new Date();
startDate.setTime(startDate.getTime()+3000);
Date endDate = new Date();
endDate.setTime(endDate.getTime()+10000);
//2.任务实例JobDetail,加载任务类,与HelloJob完成绑定
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
.withIdentity("job1","group1")//任务组
.build();
//3.触发器Trigger
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1","group1")//触发器组
.startAt(startDate)
.endAt(endDate)
.withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatSecondlyForever(5))//五秒触发一次
.build();
//关联任务和触发器,保证按照触发器定义的条件执行任务
scheduler.scheduleJob(jobDetail,trigger);
//启动
scheduler.start();
}
}
3.1SimpleTrigger触发器
SimpleTrigger对于设置和使用是最简单的一种QuartzTrigger。它是为那种需要在特定的日期/时间启动,且以一个可能的间隔时间重复执行n次的Job所设计的。
案例一:
表示在 一定的时间内,执行一次作业任务。