表信息、类信息、配置信息
表信息
表名称 | 说明 |
---|---|
qrtzblobtriggers | Trigger作为Blob类型存储(用于Quartz用户用JDBC创建他们自己定制的Trigger类型,JobStore 并不知道如何存储实例的时候) |
qrtz_calendars | 以Blob类型存储Quartz的Calendar日历信息, quartz可配置一个日历来指定一个时间范围 |
qrtzcrontriggers | 存储Cron Trigger,包括Cron表达式和时区信息。 |
qrtzfiredtriggers | 存储与已触发的Trigger相关的状态信息,以及相联Job的执行信息 |
qrtzjobdetails | 存储每一个已配置的Job的详细信息 |
qrtz_locks | 存储程序的非观锁的信息(假如使用了悲观锁) |
qrtzpausedtrigger_graps | 存储已暂停的Trigger组的信息 |
qrtzschedulerstate | 存储少量的有关 Scheduler的状态信息,和别的 Scheduler 实例(假如是用于一个集群中) |
qrtzsimpletriggers | 存储简单的 Trigger,包括重复次数,间隔,以及已触的次数 |
qrtz_triggers | 存储已配置的 Trigger的信息 |
qrztsimproptriggers | -- |
核心类信息
- QuartzSchedulerThread:负责执行向QuartzScheduler注册的触发Trigger的工作的线程。
- ThreadPool:Scheduler使用一个线程池作为任务运行的基础设施,任务通过共享线程池中的线程提供运行效率。
- QuartzSchedulerResources:包含创建QuartzScheduler实例所需的所有资源(JobStore,ThreadPool等)。
- SchedulerFactory :提供用于获取调度程序实例的客户端可用句柄的机制。
- JobStore:通过类实现的接口,这些类要为org.quartz.core.QuartzScheduler的使用提供一个org.quartz.Job和org.quartz.Trigger存储机制。作业和触发器的存储应该以其名称和组的组合为唯一性。
- QuartzScheduler :这是Quartz的核心,它是org.quartz.Scheduler接口的间接实现,包含调度org.quartz.Jobs,注册org.quartz.JobListener实例等的方法。
- Scheduler :这是Quartz Scheduler的主要接口,代表一个独立运行容器。调度程序维护JobDetails和触发器的注册表。一旦注册,调度程序负责执行作业,当他们的相关联的触发器触发(当他们的预定时间到达时)。
- Trigger :具有所有触发器通用属性的基本接口,描述了job执行的时间出发规则。- 使用TriggerBuilder实例化实际触发器。
- JobDetail :传递给定作业实例的详细信息属性。JobDetails将使用JobBuilder创建/定义。
- Job:要由表示要执行的“作业”的类实现的接口。只有一个方法 void execute(jobExecutionContext context)(jobExecutionContext 提供调度上下文各种信息,运行时数据保存在jobDataMap中)
- Job有个子接口StatefulJob ,代表有状态任务。有状态任务不可并发,前次任务没有执行完,后面任务处于阻塞等到。
quartz配置
主要配置
属性名称 | 是否必选 | 类型 | 默认值 | 说明 |
---|---|---|---|---|
org.quartz.scheduler.instanceName | 否 | String | QuartzScheduler | Schedule调度器的实体名字 |
org.quartz.scheduler.instanceId | 否 | String | NON_CLUSTERED | Schedule调度器的实体的Id,必须唯一。你想生成intanceId的时候可以设置为AUTO;想从系统属性org.quartz.scheduler.instanceId取值时可以设置为SYS_PROP |
org.quartz.scheduler.instanceIdGenerator.class | 否 | String(类名) | org.quartz.simpl.SimpleInstanceIdGenerator 生成Schudule实体Id的类,只有在属性org.quartz.scheduler.instanceId设置为AUTO时使用,默认的实现org.quartz.scheduler.SimpleInstanceGenerator是基于主机名称和时间戳生成。其他的实现查看具体的文档 | |
org.quartz.scheduler.threadName | 否 | String | instanceName ‘_QuartzSchedulerThread’ | Scheduler线程的名称 |
org.quartz.scheduler.makeSchedulerThreadDaemon | 否 | boolean | false | 指定Scheduler是否以守护线程(服务)运行 |
org.quartz.scheduler.threadsInheritContextClassLoaderOfInitializer | 否 | boolean | false | 目前不太理解 |
org.quartz.scheduler.idleWaitTime | 否 | long | 30000 | 当调度程序空闲时,在重新查询可用触发器之前,调度程序将等待毫秒的时间数。不建议少于5000ms,而少于1000是不合法的参数 |
org.quartz.scheduler.doFailureRetryInterval | 否 | long | 15000 | 使用JobStore(比如连接数据库)时Schueduler检测到失去数据库连接后重新尝试连接的毫秒数 |
org.quartz.scheduler.classLoadHelper.class | 否 | String(类名) | org.quartz.simpl.CascadingClassLoaderHelper | 类加载相关 |
org.quartz.scheduler.jobFactory.class | 否 | String(类名) | org.quartz.simpl.PropertySettingJobFctory 给Scheduler Context、Job、Trigger的JobDataMaps设置属性值的方式 | |
org.quartz.contenxt.key.SOME_KEY | 否 | String None | 键值对,保存在Scheduler Context中,比如有这样的配置org.quartz.shceduler.key.MyKey=MyValue,则在Scheduler Context中赋值方式为scheduler.getContext().put(“MyKey”, “MyValue”) | |
org.quartz.scheduler.userTransactionURL | 否 | String(url) java:comp/UserTransaction | 事务管理JNDI URL地址。只有当Quartz使用JobStoreCMT和org.quartz.scheduler.wrapJobExecutionInUserTransaction 设置为true时使用 | |
org.quartz.scheduler.wrapJobExecutionInUserTransaction | 否 | boolean | false | 只有当你在执行一个Job时想使用UserTransaction时设置为true,参考@ExecuteInJTATransaction 注解 |
org.quartz.scheduler.skipUpdateCheck | 否 | boolean | false | 是否跳过版本检测。可以设置系统参数org.terracotta.quartz.skipUpdateCheck=true或者在JAVA命令行使用-D选项。在正式库运行时应设置为true。 |
org.quartz.scheduler.batchTriggerAcquisitionMaxCount | 否 | int | 1 | 在同一时间运行Scheduler获取trigger的数量。如果设置的数量>1,并且使用JDBC JobStore,则属性org.quartz.jobStore.acquireTriggersWithinLock应设置为true,可以避破坏数据。 |
org.quartz.scheduler.batchTriggerAcquisitionFireAheadTimeWindow | 否 | long | 0 | 运行Scheduler在获取和触发tigger的提前的时间。 |
线程池配置
属性名称 | 是否必选 | 类型 | 默认值 | 说明 |
---|---|---|---|---|
org.quartz.threadPool.class | 是 | String(类名) | null | Scheduler使用的线程池名称,实现了ThreadPool接口,参考org.quartz.simpl.SimpleThreadPool |
org.quartz.threadPool.threadCount | 是 | int | -1 | 线程池里面的线程的数据,取值在1-100 |
org.quartz.threadPool.threadPriority | 否 | int | Thread.NORM_PRIORITY (5) | 线程的优先级,取值在Thread.MINPRIORITY(1)到Threa.MAXPRIORITY(10) |
org.quartz.threadPool.makeThreadsDaemons | 否 | boolean | false | 指定在线程池里面创建的线程是否是守护线程 |
org.quartz.threadPool.threadsInheritGroupOfInitializingThread | 否 | boolean | true | 线程是否属于继承自初始线程的线程组 |
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread | 否 | boolean | false | 线程上下文类加载器是否继承自初始线程的加载器 |
org.quartz.threadPool.threadNamePrefix | 否 | String | [Scheduler Name]_Workder | 指定线程池里面线程的名字的前缀 |
Listener配置
在实例化StdSchedulerFactory的时候可以注册一个全局的监听器到Scheduler中,全局监听器会监听每一个Job和Trigger的触发事件。全局监听器必选有一个无参的构造函数,并且属性值只能是基本类型(包括String)。
配置例子:
代码语言:javascript复制//trigger listener配置org.quartz.triggerListener.NAME = package.classNameorg.quartz.triggerListener.NAME.propName = propValue//job listener配置org.quartz.jobListener.NAME = package.classNameorg.quartz.jobListener.NAME.propName = propValue
JobStore配置
JobStore是Scheduler在运行时用来存储相关的信息的,比如Job, Trigger。
RAMJobStore
RAMJobStore实现类是在内存中存储信息的,程序一旦结束便丢失了相关的信息。
属性名称 | 是否必选 | 类型 | 默认值 | 说明 |
---|---|---|---|---|
org.quartz.jobStore.class | 否 | String(类名) | org.quartz.simpl.RAMJobStore | 指定使用的JobStore |
org.quartz.jobStore.misfireThreshold | 否 | int | 60000 | 触发器失败后下次触发的时间间隔 |
JDBCJobStore和JobStoreTX
JDBCJobStore和JobStoreTX都使用关系数据库来存储Schedule相关的信息。JobStoreTX在每次执行任务后都使用commint或者rollback来提交更改。
如果在一个标准的独立应用或者在一个没有使用JTA事务管理的应用中使用Quartz,JDBCJobStore是一个不错的选择。
JobStoreTX的配置如下:
属性名称 | 是否必选 | 类型 | 默认值 | 说明 |
---|---|---|---|---|
org.quartz.jobStore.class | 否 | String(类名) | org.quartz.simpl.jdbcjobstore.JobStoreTX | 使用JobStoreTX |
org.quartz.jobStore.driverDelegateClass | 是 | String(类名) | null | 使用的数据库驱动,具体的驱动列表详情如下 |
org.quartz.jobStore.dataSource | 是 | String | null | 使用的数据源名称,具体参照数据源配置 |
org.quartz.jobStore.tablePrefix | 否 | String | QRTZ_ | 表的前缀 |
org.quartz.jobStore.userProperties | 否 | boolean | false | 标示在JobDataMaps的数据全部是String |
org.quartz.jobStore.misfireThreshold | 否 | int | 60000 | 触发器触发失败后再次触犯的时间间隔 |
org.quartz.jobStore.isClustered | 否 | boolean | false | 如果有多个调度器实体的话则必须设置为true |
org.quartz.jobStore.clusterCheckinInterval | 否 | long | 15000 | 检查集群下的其他调度器实体的事件间隔 |
org.quartz.jobStore.maxMisfiresToHandleAtATime | 否 | int | 20 | -- |
org.quartz.jobStore.dontSetAutoCommintFalse | 否 | boolean | false | -- |
org.quartz.jobStore.selectWithLockSQL | 否 | String | select * from {0}locks where schedname = {1} and lockname = ? for update | -- |
org.quartz.jobStore.txlsolationLevelSerializable | 否 | boolean | false | -- |
org.quartz.jobStore.acquireTriggersWithinLocal | 否 | boolean | false | -- |
org.quartz.jobStore.lockHandler.class | 否 | String | null | -- |
org.quartz.jobStore.driverDelegateInitString | 否 | String | null | -- |
org.quartz.jobStore.driverDelegateClass数据库驱动列表
- org.quartz.impl.jdbcstore.StdJDBCDelegate 适用于完全兼容JDBC的驱动
- org.quartz.impl.jdbcstore.MSSQLDelegate 适用于Miscrosoft SQL Server和Sybase数据库
- org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
- org.quartz.impl.jdbcjobstore.WebLogicDelegate
- org.quartz.impl.jdbcjobstore.oracle.OracleDelegate
- org.quartz.impl.jdbcjobstore.oracle.WebLogicOracleDelegate
- org.quartz.impl.jdbcjobstore.oracle.weblogic.WebLogicOracleDelegate
- org.quartz.impl.jdbcjobstore.CloudscapeDelegate
- org.quartz.impl.jdbcjobstore.DB2v6Delegate
- org.quartz.impl.jdbcjobstore.DB2v7Delegate
- org.quartz.impl.jdbcjobstore.DB2v8Delegate
- org.quartz.impl.jdbcjobstore.HSQLDBDelegate
- org.quartz.impl.jdbcjobstore.PointbaseDelegate
- org.quartz.impl.jdbcjobstore.SybaseDelegate
集群使用JDBCJobStore和JobStoreTX
在JobStore使用JDBCJobStore、JobStoreTX、JobStoreCMT的情况下可以使用Quartz的集群特性简单的配置如下:
代码语言:javascript复制//主要配置org.quartz.scheduler.instanceName = MyClusteredSchedulerorg.quartz.scheduler.instanceId = AUTO
//配置数据池连接org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPoolorg.quartz.threadPool.threadCount = 25org.quartz.threadPool.treadPriority = 5
//JobStore配置org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTXorg.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcstore.oracle.OracleDelegateorg.quartz.jobStore.userProperties = trueorg.quartz.jobStore.dataSource = myDSorg.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.isClustered = trueorg.quartz.jobStore.clusterCheckinInterval = 20000
//DataSource数据源配置org.quartz.dataSource.myDS.driver = oracle.jdbc.driver.OracleDriverorg.quartz.dataSource.myDS.URL = jdbc:oracle:thin:@localhost:1521:devorg.quartz.dataSource.myDS.user = quartzorg.quartz.dataSource.myDS.password = quartzorg.quartz.dataSource.myDS.maxConnections = 5org.quartz.dataSource.myDS.validationQuery=select 0 from dual
springboot starter
会进行自动配置,可以直接使用quartz,十分方便。
自动配置
jobStoreType:
配置
实战配置
代码语言:javascript复制spring.quartz.properties.org.quartz.scheduler.instanceName = clusteredSchedulerspring.quartz.properties.org.quartz.scheduler.instanceId = AUTO
spring.quartz.properties.org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTXspring.quartz.properties.org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegatespring.quartz.properties.org.quartz.jobStore.tablePrefix = QRTZ_spring.quartz.properties.org.quartz.jobStore.isClustered = truespring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval = 10000spring.quartz.properties.org.quartz.jobStore.useProperties = false
spring.quartz.properties.org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPoolspring.quartz.properties.org.quartz.threadPool.threadCount = 2spring.quartz.properties.org.quartz.threadPool.threadPriority = 2spring.quartz.properties.org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
spring.quartz.job-store-type = jdbcspring.quartz.startup-delay=5sspring.quartz.jdbc.initialize-schema=alwaysspring.quartz.overwrite-existing-jobs=false