完全由Java开发,可以用来执行定时任务,类似于java.util.Timer。相较于Timer, Quartz增加了很多功能:1、持久性作业 - 就是保持调度定时的状态。2、作业管理 - 对调度作业进行有效的管理。
一、Quartz API核心接口有:Scheduler – 与scheduler交互的主要API;Job – 你通过scheduler执行任务,你的任务类需要实现的接口;JobDetail – 定义Job的实例;Trigger – 触发Job的执行;JobBuilder – 定义和创建JobDetail实例的接口;TriggerBuilder – 定义和创建Trigger实例的接口; 二、Job 和 Trigger
public interface Job {
public void execute(JobExecutionContext context)throws JobExecutionException;
}
(1)job的execute(context)方法被scheduler的一个工作线程调用。
(2) Job和Trigger的区别:
很多任务调度器并不区分 Job 和 Trigger。
Quartz做了区分,简单的说就是把触发条件和执行任务区分开来。这种做法使得Job可以独立于Trigger之外存储在scheduler中。当然,多个触发器也可以被绑定到一个Job。当一个Trigger过期之后,可以重新复用和这个Trigger绑定的Job。
(3)JobDetail:
JobDetail对象是在被添加到调度器的时候被Quartz客户端(也就是你的程序)创建的。用来存储一个 Job的状态信息。
public interface JobDetail {
JobKey getKey();
String getDescription();
JobDataMap getJobDataMap();
}
JobKey jobKey = JobKey.jobKey(name);
JobDetail jobDetail = JobBuilder.newJob(SpringBeanJob.class)
.storeDurably()
.withDescription(jobModel.getDescription())
.withIdentity(jobKey).build();
(4)JobDataMap
存储job的数据,相当于job的HashMap。将job加入到scheduler之前,在构建JobDetail时,可以将数据放入JobDataMap。
//创建job时候后,在jobMap中存
JobDetail job = newJob(DumbJob.class)
.withIdentity("myJob", "group1") // name "myJob", group "group1"
.usingJobData("jobSays", "Hello World!")
.usingJobData("myFloatValue", 3.141f)
.build();
//job执行过程中,使用jobMap中数据
public class DumbJob implements Job {
public DumbJob() {
}
public void execute(JobExecutionContext context)
throws JobExecutionException
{
JobKey key = context.getJobDetail().getKey();
JobDataMap dataMap = context.getJobDetail().getJobDataMap();
String jobSays = dataMap.getString("jobSays");
float myFloatValue = dataMap.getFloat("myFloatValue");
}
}
(4)Trigger:
触发器对象用来触发一个Job的执行。当你想要调度一个Job的时候,你需要实例化一个触发器并将它的触发时间调整到你希望的时间点。触发器也可以有和他们关联的JobDataMap(当多个触发器会触发同一个Job,但是需要向这个Job传递不同的data时特别有用)。Quartz框架有很多种触发器,最常用的是SimpleTrigger和CronTrigg。
(5)key
将 Job 和 Trigger 注册到 Scheduler 时,可以为它们设置 key,相当于ID。
三、Quartz生命流程scheduler是quartz的调度器入口。
创建:chedulerFactory创建。
添加:【build】后可以向这个调度器添加、删除Job和Trigger。
开始:【strart】start方法不被调用,绑定到他上面的Trigger和Job都不会生效。
结束:【shutdown】结束。
// define the job and tie it to our HelloJob class
JobDetail job = newJob(HelloJob.class)
.withIdentity("myJob", "group1") // name "myJob", group "group1"
.build();
// Trigger the job to run now, and then every 40 seconds
Trigger trigger = newTrigger()
.withIdentity("myTrigger", "group1")
.startNow()
.withSchedule(simpleSchedule()
.withIntervalInSeconds(40)
.repeatForever())
.build();
// Tell quartz to schedule the job using our trigger
sched.scheduleJob(job, trigger);
四、springboot中配置quartz
(1)引入jar
org.quartz-scheduler quartz
(2)定义业务job
public class SpringBeanJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
try {
//根据KEY获取spring上下文
ApplicationContext applicationContext = (ApplicationContext) context.getScheduler().getContext()
.get(JobConfig.KEY);
//获取服务
JobService jobService = applicationContext.getBean(JobService.class);
jobService.doJob(context.getJobDetail().getJobDataMap());
} catch (SchedulerException e) {
e.printStackTrace();
}
}
(3)配置quartzScheduler【线程池+JobStore+DataSources】
@Configuration
public class JobConfig {
public static final String KEY = "applicationContextSchedulerContextKey";
@Bean("adminQuartzScheduler")
public SchedulerFactoryBean quartzScheduler(DataSource dataSource) {
// Spring提供SchedulerFactoryBean为Scheduler提供配置信息,并被Spring容器管理其生命周期
SchedulerFactoryBean quartzScheduler = new SchedulerFactoryBean();
try {
//设置quartz的配置文件,加载quartzScheduler参数
quartzScheduler.setQuartzProperties(
PropertiesLoaderUtils.loadProperties(new ClassPathResource("quartz.properties")));
} catch (IOException e) {
e.printStackTrace();
}
//设置数据源(使用系统的主数据源,覆盖propertis文件的dataSource配置)
quartzScheduler.setDataSource(dataSource);
//启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了
quartzScheduler.setOverwriteExistingJobs(true);
quartzScheduler.setApplicationContextSchedulerContextKey(KEY);
// 延时启动(秒)
quartzScheduler.setStartupDelay(10);
return quartzScheduler;
}
}
(4)设置参数
org.quartz.scheduler.instanceName = DefaultQuartzScheduler org.quartz.scheduler.instanceId = AUTO org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool org.quartz.threadPool.threadCount = 10 org.quartz.threadPool.threadPriority = 5 org.quartz.jobStore.misfireThreshold = 60000 #JobStoreTX作为JobStore 来管理事务 org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX #使用表前缀配置JDBCJobStore org.quartz.jobStore.tablePrefix = QRTZ_ org.quartz.jobStore.isClustered = true org.quartz.jobStore.clusterCheckinInterval = 15000
(5)设置具体JobService
public interface JobService {
void saveJob(JobModel jobModel);
void doJob(JobDataMap jobDataMap);
void deleteJob(Long id) throws SchedulerException;
}
(6)实现
具体实现,下一章节单独完成。



