SchedulerFactory & Scheduler & QuartzScheduler & QuartzSchedulerThread & ThreadExecutor(DefaultThreadExecutor) & ThreadPool(SimpleThreadPool and WorkThread)是Quartz调度任务的核心类,

Scheduler

SchedulerFactory负责收集配置信息,然后初始化Scheduler需要的资料,然后创建一个Scheduler对象
Scheduler的信息存储在QRTZ_scheduler_state表中;
scheduler的check;

SchedulerContext的配置方法
org.quartz.context.key.SOME_KEY=SOME_VALUE
SchedulerContext有什么用?Quartz默认一般都用来存储什么信息?

Scheduler实例持有一个QuartzSchedulerThread对象,Scheduler中负责启动此线程。

QuartzSchedulerThread是大老板,获取Trigger及Trigger关联的Job和其他相关信息,包装成JobRunShell,调用SimpleThreadPool#runInThread传递给包工头SimpleThreadPool,SimpleThreadPool包工头下面有很多干活的工人WorkThread,这些干活的工人最大的特点就是干完一个任务可以接着干另一个任务,WorkThread对象可以复用;SimpleThreadPool有个小本本,记录着哪些工人忙着,哪些工人闲着,availWorkers,busyWorkers字段;如果来了一个任务,没有空闲的工人,就需要等着。

QuartzSchedulerThread

org.quartz.scheduler为前缀的配置中,有相当一部分是给QuartzSchedulerThread配置的;

org.quartz.scheduler.threadName:Scheduler持有的QuartzSchedulerThread的线程的名称,默认是Scheduler_Name+“_QuartzSchedulerThread”
org.quartz.scheduler.makeSchedulerThreadDaemon:Scheduler持有的QuartzSchedulerThread的线程的名称是否设置成Deamon
org.quartz.scheduler.threadsInheritContextClassLoaderOfInitializer:是否集成初始化器的ClassLoader,在StdSchedulerFactory中初始化QuartScheduler对象,在QuartScheduler中初始化QuartzSchedulerThread,在QuartzSchedulerThread中设置本线程执行时使用的ContextClassLoader,也就是说如果设置成true,跟Scheduler在一个ContextClassLoader
org.quartz.scheduler.idleWaitTime:这个配置最终是给QuartzScheudlerThread使用的,QuartzScheudlerThread的run方法里会用到此参数的值,run方法的while循环再处理完Triggers之后,会使用此值计算一个等待时间,让线程等待一段时间啥也不做,也就是让线程空闲一段时间;
org.quartz.scheduler.batchTriggerAcquisitionMaxCount:这个配置最终是给QuartzScheudlerThread使用的,用来jobStore#acquireNextTriggers的时候使用,用来一次性获取的最大的Trigger数;
org.quartz.scheduler.batchTriggerAcquisitionFireAheadTimeWindow:从Trigger表里查询将要fire的Triggers的时候,不能等到now=next_fire_time的时候再触发,程序本身还有运行的时间,这个时候需要指定一个提前的时间窗口。

已jdbcjobstore为例:
查询next fire triggers的时候,需要org.quartz.jobStore.misfireThreshold/org.quartz.scheduler.idleWaitTime/org.quartz.scheduler.batchTriggerAcquisitionMaxCount/org.quartz.scheduler.batchTriggerAcquisitionFireAheadTimeWindow
最终生成的查询语句的条件是

now-threshold<=next_fire_time<=now+idlewaittime+timewinodw

now-threshold<=next_fire_time的意思是查询还没有misfire的Trigger
如果next_fire_time>now+idlewaittime+timewinod,也就是说放到下次查询触发这些tiggers,也晚不了;也就是说next_fire_time<=now+idlewaittime+timewinodw查询的是,不能放到下次查询触发,不然就晚了的Triggers。

org.quartz.scheduler.dbFailureRetryInterval:QuartzSchedulerThread从JobStore获取Triggers的时候,可能会因为JobStore持有的Connection比如JdbcConnection失效,QuartzSchedulerThread的run方法内是个whhile循环,在下一次循环尝试获取的时候,需要使用Thread.sleep让QuartzSchedulerThread睡一会,这个一会就是根据此配置的值计算出来的。

org.quartz.scheduler.classLoadHelper.class:scheuler运行过程中实例化类什么的用的ClassLoader

org.quartz.scheduler.jobFactory.class:在生成jobDetails对象的时候,我们指定的是一个类名,也就是说这个类需要实例化,然后执行实例化后的对象的execute方法,jobFactory就是用来实例化job的。这个地方可以扩展的原因是,生成job之后,我们可以做很多的工作,比如SpringBeanJobFactory增加了给Job对象注入Spring IOC容器内的Bean的能力;Quartz内置的PropertSeetingJobFactory可以将JobDataMap里的信息注入到Job对象的set方法;

ThreadExecutor

ThreadExecutor,线程执行器,提供了两种实现
DefaultThreadExecutor和WorkManagerThreadExecutor
DefaultThreadExecutor直接调用thread.start()启动线程
WorkManagerThreadExecutor是试用commonj执行线程
ThreadExecutor一个Scheduler持有一个,在ScheduleFactory中被初始化之后,在三个地方使用到了,ClusterManager MifireHandler 和在QuartzScheduler中启用QuartzSchedulerThread线程,这三个线程是quartz的三个主线程,所有的活都是这三个线程干的。

org.quartz.threadExecutor.class

ThreadPool

ThreadPool是用来执行用户提交的Job的,一个Scheduler对象一个;
QuartzScheulerThread的作用是从JobStore取出Trigger执行关联的job,使用JobRunShell这个Java Runnable的实现包裹关联的Job,然后将Job放到ThreadPool中执行;
SimpleThreadPool实现解析,

org.quartz.threadPool.class
org.quartz.threadPool.threadCount
org.quartz.threadPool.threadPriority
SimpleThreadPool
org.quartz.threadPool.makeThreadsDaemons
org.quartz.threadPool.threadsInheritGroupOfInitializingThread
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread
org.quartz.threadPool.threadNamePrefix

注解

  1. DisallowConcurrentExecution
  2. ExecutionInJTATranaction
  3. PersistJobDataAfterExecution:QRTZ_JOB_DETAILS表中的Job_DATA字段,如果在Job类上添加了PersistJobDataAfterExecution注解,会序列化到此字段;是Java 序列化

参考

如何让一个Quartz实例不执行任务:此博客展示了一个ThreadExecutor的高级用法,通过自定义一个ThreadExecutor,达到不启用这三个线程的目的;

Quartz Scheduler相关推荐

  1. HOW-TO:具有MySQL的JEE应用程序中具有集群功能的Quartz Scheduler

    Quartz Scheduler是Java世界中最流行的调度库之一. 过去,我主要在Spring应用程序中使用Quartz. 最近,我一直在研究要在云中部署的JBoss 7.1.1上运行的JEE 6应 ...

  2. HOW-TO:带有MySQL的JEE应用程序中具有集群功能的Quartz Scheduler

    Quartz Scheduler是Java世界中最流行的调度库之一. 过去,我主要在Spring应用程序中使用Quartz. 最近,我一直在研究将在云中部署的JBoss 7.1.1上运行的JEE 6应 ...

  3. 如何使用Quartz Scheduler和日志记录创建Web应用程序

    我有时会在Quartz Scheduler论坛中为用户提供帮助. 有时,有人会问他/她如何在Web应用程序中设置Quartz. 实际上,这是一件相当简单的事情. 该库已经带有一个ServletCont ...

  4. 在MySQL数据库上使用Quartz Scheduler入门

    这是一些简单的步骤,可帮助您使用Groovy在MySQL数据库上完全入门Quartz Scheduler. 以下脚本可让您使用外部文件快速尝试不同的Quartz配置设置. 第一步是使用表设置数据库. ...

  5. Quartz Scheduler插件–隐藏的宝藏

    尽管在官方文档中进行了简要描述,但我相信Quartz插件了解得还不够多,看看它们有多有用. 本质上,Quartz中的插件是方便的类,用于包装基础侦听器的注册. 您可以自由编写自己的插件,但我们将专注于 ...

  6. 在java中使用quartz_如何在Java中使用Quartz Scheduler框架运行cron作业?

    我在Java中使用Quartz Scheduler来运行cron作业 . 这是我第一次使用这个框架来运行cron作业,所以我有些困惑 . 我正在关注这个tutorial以更好地理解如何使用Quartz ...

  7. java quartz Scheduler 操作Trigger

    一个JobDetail可以有多个Trigger //增 sched.scheduleJob(trigger);//trigger必须使用forJob绑定JobDetail //查 System.out ...

  8. java quartz Scheduler 操作JobDetail

    scheduler可以看成是一个容器,对JobDetail进行增删改查 //增 sched.addJob(job,false);// false表示不替换,ture表示替换,既更新;另外一般使用 比较 ...

  9. java 调度服务器,Quartz Scheduler - 使用PostgreSQL服务器调度作业

    我有一个简单的winform应用程序,我有两个按钮 . 在第一个按钮单击我创建一个作业并将其存储在我的postgres服务器中 . 在第二个按钮单击时,我启动调度程序以执行作业 . 我的工作只不过是现 ...

最新文章

  1. eclipse如何连接mysql_Python如何连接 MySQL?
  2. pip Can't connect to HTTPS URL because the SSL module is not available
  3. css中小型大写,css3 – OpenType小型大写的CSS回退
  4. android webview tel:,Android WebView“tel:”和“mailto:”链接显示未找到网页
  5. 九十、动态规划系列背包问题之多重背包
  6. 关于intel 32 hex文件格式以及hex2rom.sed
  7. Caliburn笔记-Action简写(wpf框架)
  8. iview中嵌套使用tabs注意事项
  9. SELinux深入理解
  10. JavaScript面向对象的理解
  11. 这次看到源码了,华为开源了方舟编译器
  12. 如何写好简历及如何准备面试(转)
  13. 【kuangbin专题】Manacher
  14. LeetCode 141. 环形链表(Linked List Cycle) 19
  15. SEO人员,你真的要做一个采集侠吗?
  16. Android Studio在线自动升级版本
  17. LaTeX常用表格绘制入门
  18. java抖音字符视频_java爬取新版抖音无水印视频教程(2020/09/14附带java代码)
  19. 测试窗体的FormBorderStyle属性,不同属性所对应的窗体边框显示情况
  20. 塔式太阳能热发电系统的防雷设计

热门文章

  1. 学过欧姆定律就能看懂 模拟电路与数字电路的区别
  2. surfacecontrol.java_简单说说JAVA层中Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的关系...
  3. 阅读论文的方法和技巧
  4. 010106漏洞利用
  5. 手机端访问PC端网站判断识别跳转至手机端页面代码集锦
  6. 嵌入式 - 单片机三种烧录方式 ISP, IAP, ICP 简述
  7. 工作那些事(一)今年工作不好找
  8. php 短信验证登录,短信验证码注册登录的实现,php接入的3种方法(附示例)
  9. WRF与WPS的编译与安装(转载)
  10. WriteProcessMemory函数说明