暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

springboot使用quartz的配置

开发架构二三事 2019-08-29
1446


表信息、类信息、配置信息

表信息

表名称说明
qrtzblobtriggersTrigger作为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.instanceNameStringQuartzSchedulerSchedule调度器的实体名字
org.quartz.scheduler.instanceIdStringNON_CLUSTEREDSchedule调度器的实体的Id,必须唯一。你想生成intanceId的时候可以设置为AUTO;想从系统属性org.quartz.scheduler.instanceId取值时可以设置为SYS_PROP
org.quartz.scheduler.instanceIdGenerator.classString(类名)org.quartz.simpl.SimpleInstanceIdGenerator 生成Schudule实体Id的类,只有在属性org.quartz.scheduler.instanceId设置为AUTO时使用,默认的实现org.quartz.scheduler.SimpleInstanceGenerator是基于主机名称和时间戳生成。其他的实现查看具体的文档
org.quartz.scheduler.threadNameStringinstanceName + ‘_QuartzSchedulerThread’Scheduler线程的名称
org.quartz.scheduler.makeSchedulerThreadDaemonbooleanfalse指定Scheduler是否以守护线程(服务)运行
org.quartz.scheduler.threadsInheritContextClassLoaderOfInitializerbooleanfalse目前不太理解
org.quartz.scheduler.idleWaitTimelong30000当调度程序空闲时,在重新查询可用触发器之前,调度程序将等待毫秒的时间数。不建议少于5000ms,而少于1000是不合法的参数
org.quartz.scheduler.doFailureRetryIntervallong15000使用JobStore(比如连接数据库)时Schueduler检测到失去数据库连接后重新尝试连接的毫秒数
org.quartz.scheduler.classLoadHelper.classString(类名)org.quartz.simpl.CascadingClassLoaderHelper类加载相关
org.quartz.scheduler.jobFactory.classString(类名)org.quartz.simpl.PropertySettingJobFctory 给Scheduler Context、Job、Trigger的JobDataMaps设置属性值的方式
org.quartz.contenxt.key.SOME_KEYString None键值对,保存在Scheduler Context中,比如有这样的配置org.quartz.shceduler.key.MyKey=MyValue,则在Scheduler Context中赋值方式为scheduler.getContext().put(“MyKey”, “MyValue”)
org.quartz.scheduler.userTransactionURLString(url) java:comp/UserTransaction事务管理JNDI URL地址。只有当Quartz使用JobStoreCMT和org.quartz.scheduler.wrapJobExecutionInUserTransaction 设置为true时使用
org.quartz.scheduler.wrapJobExecutionInUserTransactionbooleanfalse只有当你在执行一个Job时想使用UserTransaction时设置为true,参考@ExecuteInJTATransaction 注解
org.quartz.scheduler.skipUpdateCheckbooleanfalse是否跳过版本检测。可以设置系统参数org.terracotta.quartz.skipUpdateCheck=true或者在JAVA命令行使用-D选项。在正式库运行时应设置为true。
org.quartz.scheduler.batchTriggerAcquisitionMaxCountint1在同一时间运行Scheduler获取trigger的数量。如果设置的数量>1,并且使用JDBC JobStore,则属性org.quartz.jobStore.acquireTriggersWithinLock应设置为true,可以避破坏数据。
org.quartz.scheduler.batchTriggerAcquisitionFireAheadTimeWindowlong0运行Scheduler在获取和触发tigger的提前的时间。

线程池配置

属性名称是否必选类型默认值说明
org.quartz.threadPool.classString(类名)nullScheduler使用的线程池名称,实现了ThreadPool接口,参考org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCountint-1线程池里面的线程的数据,取值在1-100
org.quartz.threadPool.threadPriorityintThread.NORM_PRIORITY (5)线程的优先级,取值在Thread.MINPRIORITY(1)到Threa.MAXPRIORITY(10)
org.quartz.threadPool.makeThreadsDaemonsbooleanfalse指定在线程池里面创建的线程是否是守护线程
org.quartz.threadPool.threadsInheritGroupOfInitializingThreadbooleantrue线程是否属于继承自初始线程的线程组
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThreadbooleanfalse线程上下文类加载器是否继承自初始线程的加载器
org.quartz.threadPool.threadNamePrefixString[Scheduler Name]_Workder指定线程池里面线程的名字的前缀

Listener配置

在实例化StdSchedulerFactory的时候可以注册一个全局的监听器到Scheduler中,全局监听器会监听每一个Job和Trigger的触发事件。全局监听器必选有一个无参的构造函数,并且属性值只能是基本类型(包括String)。

配置例子:

  1. //trigger listener配置

  2. org.quartz.triggerListener.NAME = package.className

  3. org.quartz.triggerListener.NAME.propName = propValue

  4. //job listener配置

  5. org.quartz.jobListener.NAME = package.className

  6. org.quartz.jobListener.NAME.propName = propValue

JobStore配置

JobStore是Scheduler在运行时用来存储相关的信息的,比如Job, Trigger。

RAMJobStore

RAMJobStore实现类是在内存中存储信息的,程序一旦结束便丢失了相关的信息。

属性名称是否必选类型默认值说明
org.quartz.jobStore.classString(类名)org.quartz.simpl.RAMJobStore指定使用的JobStore
org.quartz.jobStore.misfireThresholdint60000触发器失败后下次触发的时间间隔

JDBCJobStore和JobStoreTX

JDBCJobStore和JobStoreTX都使用关系数据库来存储Schedule相关的信息。JobStoreTX在每次执行任务后都使用commint或者rollback来提交更改。

如果在一个标准的独立应用或者在一个没有使用JTA事务管理的应用中使用Quartz,JDBCJobStore是一个不错的选择。

JobStoreTX的配置如下:
属性名称是否必选类型默认值说明
org.quartz.jobStore.classString(类名)org.quartz.simpl.jdbcjobstore.JobStoreTX使用JobStoreTX
org.quartz.jobStore.driverDelegateClassString(类名)null使用的数据库驱动,具体的驱动列表详情如下
org.quartz.jobStore.dataSourceStringnull使用的数据源名称,具体参照数据源配置
org.quartz.jobStore.tablePrefixStringQRTZ_表的前缀
org.quartz.jobStore.userPropertiesbooleanfalse标示在JobDataMaps的数据全部是String
org.quartz.jobStore.misfireThresholdint60000触发器触发失败后再次触犯的时间间隔
org.quartz.jobStore.isClusteredbooleanfalse如果有多个调度器实体的话则必须设置为true
org.quartz.jobStore.clusterCheckinIntervallong15000检查集群下的其他调度器实体的事件间隔
org.quartz.jobStore.maxMisfiresToHandleAtATimeint20--
org.quartz.jobStore.dontSetAutoCommintFalsebooleanfalse--
org.quartz.jobStore.selectWithLockSQLStringselect * from {0}locks where schedname = {1} and lockname = ? for update--
org.quartz.jobStore.txlsolationLevelSerializablebooleanfalse--
org.quartz.jobStore.acquireTriggersWithinLocalbooleanfalse--
org.quartz.jobStore.lockHandler.classStringnull--
org.quartz.jobStore.driverDelegateInitStringStringnull--
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的集群特性简单的配置如下:

  1. //主要配置

  2. org.quartz.scheduler.instanceName = MyClusteredScheduler

  3. org.quartz.scheduler.instanceId = AUTO


  4. //配置数据池连接

  5. org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool

  6. org.quartz.threadPool.threadCount = 25

  7. org.quartz.threadPool.treadPriority = 5


  8. //JobStore配置

  9. org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX

  10. org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcstore.oracle.OracleDelegate

  11. org.quartz.jobStore.userProperties = true

  12. org.quartz.jobStore.dataSource = myDS

  13. org.quartz.jobStore.misfireThreshold = 60000


  14. org.quartz.jobStore.isClustered = true

  15. org.quartz.jobStore.clusterCheckinInterval = 20000


  16. //DataSource数据源配置

  17. org.quartz.dataSource.myDS.driver = oracle.jdbc.driver.OracleDriver

  18. org.quartz.dataSource.myDS.URL = jdbc:oracle:thin:@localhost:1521:dev

  19. org.quartz.dataSource.myDS.user = quartz

  20. org.quartz.dataSource.myDS.password = quartz

  21. org.quartz.dataSource.myDS.maxConnections = 5

  22. org.quartz.dataSource.myDS.validationQuery=select 0 from dual

springboot starter

会进行自动配置,可以直接使用quartz,十分方便。

自动配置

jobStoreType:

配置

实战配置

  1. spring.quartz.properties.org.quartz.scheduler.instanceName = clusteredScheduler

  2. spring.quartz.properties.org.quartz.scheduler.instanceId = AUTO


  3. spring.quartz.properties.org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX

  4. spring.quartz.properties.org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate

  5. spring.quartz.properties.org.quartz.jobStore.tablePrefix = QRTZ_

  6. spring.quartz.properties.org.quartz.jobStore.isClustered = true

  7. spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval = 10000

  8. spring.quartz.properties.org.quartz.jobStore.useProperties = false


  9. spring.quartz.properties.org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool

  10. spring.quartz.properties.org.quartz.threadPool.threadCount = 2

  11. spring.quartz.properties.org.quartz.threadPool.threadPriority = 2

  12. spring.quartz.properties.org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true


  13. spring.quartz.job-store-type = jdbc

  14. spring.quartz.startup-delay=5s

  15. spring.quartz.jdbc.initialize-schema=always

  16. spring.quartz.overwrite-existing-jobs=false

文章转载自开发架构二三事,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论