Quartz浅析
Posted ychblog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Quartz浅析相关的知识,希望对你有一定的参考价值。
一、Quartz核心部分
-- Schedule - 任务调度器
1、由SchedulerFactory创建,一般使用StdSchedulerFactory,创建后处于“待定”状态,start方法启动。
2、主要用来进行组装任务与触发器注册到调度器中;启动触发器。
-- Trigger - 触发器
1、设置触发条件,常用SimpleTrigger和CronTrigger。
-- Job - 任务
1、执行的任务,需要实现Job接口(实际可继承QuartzJobBean),重写execute方法。
二、Quartz集群
1、集群中的每个节点是一个独立的Quartz应用,通过相同的数据库表来感知到另一Quartz应用。
2、集群使用JobStoreSupport存储trigger和job,基于jdbc将trigger和job存储到数据库中。
Quartz表
(表细则,待更新)
三、线程(调度线程、任务执行线程)
调度线程 - 常规调度线程:轮询存储的所有trigger,有需要触发的trigger,从任务执行线程池获取一个空闲线程,执行与该trigger关联的任务。
调度线程 - MisFire线程:扫描所有的trigger,查看是否有misfiredtrigger,如果有的话根据misfire的策略分别处理。
四、配置调度参数
SchedulerFactoryBean iScheduler = new SchedulerFactoryBean();
Scheduler.setDataSource(DataSource dataSource);
// quartz参数
Properties prop = new Properties();
prop.put("org.quartz.scheduler.instanceName", "xxxxx");
prop.put("org.quartz.scheduler.instanceId", "AUTO");
// 线程池配置
prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");
prop.put("org.quartz.threadPool.threadCount", "20");
prop.put("org.quartz.threadPool.threadPriority", "5");
// JobStore配置
prop.put("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX");
// 集群配置
prop.put("org.quartz.jobStore.isClustered", "true");
prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000");
prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "1");
prop.put("org.quartz.jobStore.txIsolationLevelSerializable", "true");
// sqlserver 启用
prop.put("org.quartz.jobStore.misfireThreshold", "12000");
prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_");
iScheduler.setQuartzProperties(prop);
iScheduler.setSchedulerName("rabbitScheduler");
// 延时启动
iScheduler.setStartupDelay(1);
iScheduler.setApplicationContextSchedulerContextKey("applicationContextKey");
// 可选,QuartzScheduler
// 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了
iScheduler.setOverwriteExistingJobs(true);
// 设置自动启动,默认为true
iScheduler.setAutoStartup(true);
五、创建一个调度
// 构建job信息, xxxxxJob.class实现了Quartz Job
JobDetail jobDetail = JobBuilder.newJob(xxxxxJob.class).withIdentity(xxxxxJobKey).build();
// 表达式调度构建器
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(xxxxxCronExpression);
//设置失败策略,yourJobBean为自定义Job具体信息的Bean
cronScheduleBuilder = myCronScheduleMisfirePolicy(MisfirePolicy, cronScheduleBuilder);
// 按新的cronExpression表达式构建一个新的trigger
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("TriggerKey").withSchedule(cronScheduleBuilder).build();
// 放入参数,运行时的方法可以获取
jobDetail.getJobDataMap().put("JOB_PARAM_KEY", job);
// 将该给定添加JobDetail到调度程序,并将给定Trigger与它关联
scheduler.scheduleJob(jobDetail, trigger);
cronScheduleBuilder myCronScheduleMisfirePolicy(MisfirePolicy, cronScheduleBuilder){
switch (MisfirePolicy) {
case Schedule.MISFIRE_DEFAULT:
return cb;
case Schedule.MISFIRE_IGNORE_MISFIRES:
return cb.withMisfireHandlingInstructionIgnoreMisfires();
case Schedule.MISFIRE_FIRE_AND_PROCEED:
return cb.withMisfireHandlingInstructionFireAndProceed();
case Schedule.MISFIRE_DO_NOTHING:
return cb.withMisfireHandlingInstructionDoNothing();
}
}
(持续更新)
以上是关于Quartz浅析的主要内容,如果未能解决你的问题,请参考以下文章