org.quartz-scheduler 基礎過程

 

特徵

  • Quartz將定時任務分爲任務 JobDetail 和 觸發器Trigger;同一個JobDetail能夠有多個Trigger;默認的RAMJobStore中經過TreeSet<TriggerWrapper>來管理多個Trigger
  • Quartz有一個專門的調度線程quartzSchedulerThread對任務進行管理,任務執行有另外專門的線程池(默認是SimpleThreadPool);
  • Quartz可以經過序列化,將定時任務保存在數據庫 JobStore, 默認RAMJobStore,存儲在隨機內存中(mysql/mongodb)

流程

初始化調度器

任務執行

核心: QuartzSchedulerThread.run()中循環執行。每一次任務的執行過程都會建立實例JobRunShell。java

  1. 調度線程首先去線程池中獲取可用的線程,若是沒有的話,就阻塞;
  2. 從JobStore(從存儲介質中獲取觸發器,存儲介質能夠是內存也能夠是數據庫)獲取(接下來30s內的,但只有在2ms內時纔會真正執行)觸發器,而後等待該觸發器觸發;
  3. 調度線程每次建立一個JobRunShell(就是一個Runnable),而後從線程池中調用線程執行該任務;獲取trigger、JobDetail以及生成Job實例,而後執行job的execute接口函數。

一次完成的過程

private Scheduler createScheduler() {
  Scheduler result;
  try {
    StdSchedulerFactory factory = new StdSchedulerFactory();
    Properties prop = new Properties();
    prop.put("org.quartz.threadPool.class",
    		org.quartz.simpl.SimpleThreadPool.class.getName());
    prop.put("org.quartz.threadPool.threadCount", "1");
    prop.put("org.quartz.scheduler.instanceName", liteJobConfig.getJobName());
    prop.put("org.quartz.jobStore.misfireThreshold", "1");
    prop.put("org.quartz.plugin.shutdownhook.class", JobShutdownHookPlugin.class.getName());
    prop.put("org.quartz.plugin.shutdownhook.cleanShutdown", Boolean.TRUE.toString());
    factory.initialize(prop);
    result = factory.getScheduler();
  } catch (final SchedulerException ex) {
   	throw new JobSystemException(ex);
  }
  return result;
}
相關文章
相關標籤/搜索