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浅析的主要内容,如果未能解决你的问题,请参考以下文章

Quartz定时器知识概括

Quartz实战源码解析Quartz分布式集群实现

Quartz实战源码解析Quartz分布式集群实现

Quartz实战源码解析Quartz分布式集群实现

quartz 任务调度问题,每次都执行两次 相隔只有几微秒

Quartz-第四篇 常规quartz的使用