如何免费注册并导航到山东钢铁股份有限公司莱芜分公司的网站建设空间?
摘要:网站建设免费空间注册导航,山东钢铁股份有限公司莱芜分公司,做演讲视频的网站,福州网站建设的公司quartz简介 Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目&#xff0c
网站建设免费空间注册导航,山东钢铁股份有限公司莱芜分公司,做演讲视频的网站,福州网站建设的公司quartz简介
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目#xff0c;完全由Java开发#xff0c;可以用来执行定时任务#xff0c;类似于java.util.Timer。但是相较于Timer#xff0c; Quartz增加了很多功能#xff1a; 持久性作业 - 就是保持调度…quartz简介
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目完全由Java开发可以用来执行定时任务类似于java.util.Timer。但是相较于Timer Quartz增加了很多功能 持久性作业 - 就是保持调度定时的状态; 作业管理 - 对调度作业进行有效的管理; 官方文档 http://www.quartz-scheduler.org/documentation/ http://www.quartz-scheduler.org/api/2.3.0/index.html
quartz的使用
非Spring环境
引入
!-- 核心包 --
dependencygroupIdorg.quartz-scheduler/groupIdartifactIdquartz/artifactIdversion2.3.0/version
/dependency
!-- 工具包 --
dependencygroupIdorg.quartz-scheduler/groupIdartifactIdquartz-jobs/artifactIdversion2.3.0/version
/dependency编码
1、新建一个任务实现 org.quartz.Job 接口
public class MyJob implements Job {Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {System.out.println(任务被执行了。。。);}
}2、创建调度器、jobDetail 实例、trigger 实例、执行
public static void main(String[] args) throws Exception {// 1.创建调度器 SchedulerSchedulerFactory factory new StdSchedulerFactory();Scheduler scheduler factory.getScheduler();// 2.创建JobDetail实例并与MyJob类绑定(Job执行内容)JobDetail job JobBuilder.newJob(MyJob.class).withIdentity(job1, group1).build();// 3.构建Trigger实例,每隔30s执行一次Trigger trigger TriggerBuilder.newTrigger().withIdentity(trigger1, group1).startNow()//设置跑在哪个scheduler上频率是什么.withSchedule(simpleSchedule().withIntervalInSeconds(30).repeatForever()).build();// 4.执行开启调度器scheduler.scheduleJob(job, trigger);System.out.println(System.currentTimeMillis());scheduler.start();//主线程睡眠1分钟然后关闭调度器TimeUnit.MINUTES.sleep(1);scheduler.shutdown();System.out.println(System.currentTimeMillis());
}与Spring boot集成
引入
!-- Quartz 任务调度 --
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-quartz/artifactId
/dependency默认在spring-boot-autoconfigure jar包中已自动配置。包 org.springframework.boot.autoconfigure.quartz。
编码
同上。
其他说明
Quartz定时任务默认都是并发执行的不会等待上一次任务执行完毕只要间隔时间到就会执行, 如果定时任执行太长会长时间占用资源导致其它任务堵塞。
DisallowConcurrentExecution 禁止并发执行多个相同定义的JobDetail, 这个注解是加在Job类上的, 但意思并不是不能同时执行多个Job, 而是不能并发执行同一个Job Definition(由JobDetail定义), 但是可以同时执行多个不同的JobDetail。
PersistJobDataAfterExecution 同样, 也是加在Job上。表示当正常执行完Job后, JobDataMap中的数据应该被改动, 以被下一次调用时用。
当使用 PersistJobDataAfterExecution 注解时, 为了避免并发时, 存储数据造成混乱, 强烈建议把 DisallowConcurrentExecution 注解也加上。
阻止特定时间运行
//2014-8-15这一天不执行任何任务
Calendar c new GregorianCalendar(2014, 7, 15);
cal.setDayExcluded(c, true);
scheduler.addCalendar(exclude, cal, false, false);核心类介绍
Quartz 的核心类有以下三部分
任务 Job 需要实现的任务类实现 execute() 方法执行后完成任务。触发器 Trigger 包括 SimpleTrigger 和 CronTrigger。调度器 Scheduler 任务调度器负责基于 Trigger触发器来执行 Job任务
JobDetail
JobDetail 的作用是绑定 Job是一个任务实例它为 Job 添加了许多扩展参数。
每次Scheduler调度执行一个Job的时候首先会拿到对应的Job的类然后创建该Job实例再去执行Job中的execute()的内容任务执行结束后关联的Job对象实例会被释放且会被JVM GC清除。 JobDetail 就是一个Job实例的包装类。Sheduler每次执行都会根据新的Job实例这样就可以 规避并发访问 的问题。 JobExecutionContext
当 Scheduler 调用一个 job就会将 JobExecutionContext 传递给 Job 的 execute() 方法;Job 能通过 JobExecutionContext 对象访问到 Quartz 运行时候的环境以及 Job 本身的明细数据。
JobDataMap
有状态的 job 可以理解为多次 job调用期间可以持有一些状态信息这些状态信息存储在 JobDataMap 中。
而默认的无状态 job每次调用时都会创建一个新的 JobDataMap。 让Job支持有状态则需要在Job类上加注解 PersistJobDataAfterExecution Trigger
Trigger 可以设置任务的开始结束时间 Scheduler 会根据参数进行触发。
Calendar
一个Trigger可以和多个Calendar关联以便排除或包含某些时间点。例如每周星期一早上10:00执行任务但是如果碰到法定的节日则不执行这时就需要在Trigger触发机制的基础上使用Calendar进行定点排除。
public interface Calendar extends java.io.Serializable, java.lang.Cloneable {int MONTH 0;void setBaseCalendar(Calendar baseCalendar);Calendar getBaseCalendar();boolean isTimeIncluded(long timeStamp);//获取给定时间之后的下一个include 时间。long getNextIncludedTime(long timeStamp);String getDescription();void setDescription(String description);Object clone();
}Calendar 名称用法精度BaseCalendar为高级的 Calendar 实现了基本的功能实现了 org.quartz.Calendar 接口AnnualCalendar指定年中一天或多天。忽略年份。天CronCalendar指定CronExpression表达的时间集合。秒DailyCalendar每个DailyCalendar仅允许指定单个时间范围并且该时间范围可能不会跨越每日边界即您不能指定从上午8点至凌晨5点的时间范围。 如果属性invertTimeRange为false默认则时间范围定义触发器不允许触发的时间范围。 如果invertTimeRange为true则时间范围被反转 - 也就是排除在定义的时间范围之外的所有时间。毫秒HolidayCalendar从 Trigger 中排除/包含节假日天MonthlyCalendar排除/包含月份中的指定数天天WeeklyCalendar排除/包含星期中的任意周几天
源码解析
配置
QuartzAutoConfiguration
quartz在Spring boot 中 通过 在spring-boot-autoconfigure jar中的包 org.springframework.boot.autoconfigure.quartz下的 QuartzAutoConfiguration 类进行配置。
Configuration(proxyBeanMethods false)
ConditionalOnClass({ Scheduler.class, SchedulerFactoryBean.class, PlatformTransactionManager.class })
EnableConfigurationProperties(QuartzProperties.class)
AutoConfigureAfter({ DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class,LiquibaseAutoConfiguration.class, FlywayAutoConfiguration.class })
public class QuartzAutoConfiguration {BeanConditionalOnMissingBeanpublic SchedulerFactoryBean quartzScheduler(QuartzProperties properties,ObjectProviderSchedulerFactoryBeanCustomizer customizers, ObjectProviderJobDetail jobDetails,MapString, Calendar calendars, ObjectProviderTrigger triggers, ApplicationContext applicationContext) {SchedulerFactoryBean schedulerFactoryBean new SchedulerFactoryBean();SpringBeanJobFactory jobFactory new SpringBeanJobFactory();jobFactory.setApplicationContext(applicationContext);schedulerFactoryBean.setJobFactory(jobFactory);if (properties.getSchedulerName() ! null) {schedulerFactoryBean.setSchedulerName(properties.getSchedulerName());}schedulerFactoryBean.setAutoStartup(properties.isAutoStartup());schedulerFactoryBean.setStartupDelay((int) properties.getStartupDelay().getSeconds());schedulerFactoryBean.setWaitForJobsToCompleteOnShutdown(properties.isWaitForJobsToCompleteOnShutdown());schedulerFactoryBean.setOverwriteExistingJobs(properties.isOverwriteExistingJobs());if (!properties.getProperties().isEmpty()) {schedulerFactoryBean.setQuartzProperties(asProperties(properties.getProperties()));}schedulerFactoryBean.setJobDetails(jobDetails.orderedStream().toArray(JobDetail[]::new));schedulerFactoryBean.setCalendars(calendars);schedulerFactoryBean.setTriggers(triggers.orderedStream().toArray(Trigger[]::new));customizers.orderedStream().forEach((customizer) - customizer.customize(schedulerFactoryBean));return schedulerFactoryBean;}private Properties asProperties(MapString, String source) {Properties properties new Properties();properties.putAll(source);return properties;}Configuration(proxyBeanMethods false)ConditionalOnSingleCandidate(DataSource.class)ConditionalOnProperty(prefix spring.quartz, name job-store-type, havingValue jdbc)protected static class JdbcStoreTypeConfiguration {BeanOrder(0)public SchedulerFactoryBeanCustomizer dataSourceCustomizer(QuartzProperties properties, DataSource dataSource,QuartzDataSource ObjectProviderDataSource quartzDataSource,ObjectProviderPlatformTransactionManager transactionManager) {return (schedulerFactoryBean) - {DataSource dataSourceToUse getDataSource(dataSource, quartzDataSource);schedulerFactoryBean.setDataSource(dataSourceToUse);PlatformTransactionManager txManager transactionManager.getIfUnique();if (txManager ! null) {schedulerFactoryBean.setTransactionManager(txManager);}};}private DataSource getDataSource(DataSource dataSource, ObjectProviderDataSource quartzDataSource) {DataSource dataSourceIfAvailable quartzDataSource.getIfAvailable();return (dataSourceIfAvailable ! null) ? dataSourceIfAvailable : dataSource;}BeanConditionalOnMissingBeanpublic QuartzDataSourceInitializer quartzDataSourceInitializer(DataSource dataSource,QuartzDataSource ObjectProviderDataSource quartzDataSource, ResourceLoader resourceLoader,QuartzProperties properties) {DataSource dataSourceToUse getDataSource(dataSource, quartzDataSource);return new QuartzDataSourceInitializer(dataSourceToUse, resourceLoader, properties);}/*** Additional configuration to ensure that {link SchedulerFactoryBean} and* {link Scheduler} beans depend on any beans that perform data source* initialization.*/Configuration(proxyBeanMethods false)static class QuartzSchedulerDependencyConfiguration {Beanstatic SchedulerDependsOnBeanFactoryPostProcessor quartzSchedulerDataSourceInitializerDependsOnBeanFactoryPostProcessor() {return new SchedulerDependsOnBeanFactoryPostProcessor(QuartzDataSourceInitializer.class);}BeanConditionalOnBean(FlywayMigrationInitializer.class)static SchedulerDependsOnBeanFactoryPostProcessor quartzSchedulerFlywayDependsOnBeanFactoryPostProcessor() {return new SchedulerDependsOnBeanFactoryPostProcessor(FlywayMigrationInitializer.class);}Configuration(proxyBeanMethods false)ConditionalOnClass(SpringLiquibase.class)static class LiquibaseQuartzSchedulerDependencyConfiguration {BeanConditionalOnBean(SpringLiquibase.class)static SchedulerDependsOnBeanFactoryPostProcessor quartzSchedulerLiquibaseDependsOnBeanFactoryPostProcessor() {return new SchedulerDependsOnBeanFactoryPostProcessor(SpringLiquibase.class);}}}}/*** {link AbstractDependsOnBeanFactoryPostProcessor} for Quartz {link Scheduler} and* {link SchedulerFactoryBean}.*/private static class SchedulerDependsOnBeanFactoryPostProcessor extends AbstractDependsOnBeanFactoryPostProcessor {SchedulerDependsOnBeanFactoryPostProcessor(Class?... dependencyTypes) {super(Scheduler.class, SchedulerFactoryBean.class, dependencyTypes);}}}
在创建 SchedulerFactoryBean 时 会把设置JobDetailsTriggers。
SchedulerFactoryBean 可以通过 SchedulerFactoryBeanCustomizer 来设置属性。
FunctionalInterface
public interface SchedulerFactoryBeanCustomizer {/*** Customize the {link SchedulerFactoryBean}.* param schedulerFactoryBean the scheduler to customize*/void customize(SchedulerFactoryBean schedulerFactoryBean);}QuartzProperties
quartz 的 配置通过 spring.quartz 参数 配置。 quartz.properties里边的配置都可以放到application.yml里的spring. quartz.properties下边 spring:quartz:properties:org:quartz:threadPool:threadCount: 10threadPriority: 5jobStore:misfireThreshold: 50000ConfigurationProperties(spring.quartz)
public class QuartzProperties {/*** Quartz job store type.*/private JobStoreType jobStoreType JobStoreType.MEMORY;private String schedulerName;private boolean autoStartup true;private Duration startupDelay Duration.ofSeconds(0);private boolean waitForJobsToCompleteOnShutdown false;private boolean overwriteExistingJobs false;/*** spring. quartz.properties*/private final MapString, String properties new HashMap();private final Jdbc jdbc new Jdbc();}加载配置过程
1、获取spring 配置 //QuartzAutoConfiguration.QuartzAutoConfigurationif (!properties.getProperties().isEmpty()) {schedulerFactoryBean.setQuartzProperties(asProperties(properties.getProperties()));}2、合并一些配置并初始化
//SchedulerFactoryBean
private void initSchedulerFactory(StdSchedulerFactory schedulerFactory) throws SchedulerException, IOException {Properties mergedProps new Properties();if (this.resourceLoader ! null) {mergedProps.setProperty(StdSchedulerFactory.PROP_SCHED_CLASS_LOAD_HELPER_CLASS,ResourceLoaderClassLoadHelper.class.getName());}if (this.taskExecutor ! null) {mergedProps.setProperty(StdSchedulerFactory.PROP_THREAD_POOL_CLASS,LocalTaskExecutorThreadPool.class.getName());}else {// Set necessary default properties here, as Quartz will not apply// its default configuration when explicitly given properties.mergedProps.setProperty(StdSchedulerFactory.PROP_THREAD_POOL_CLASS, SimpleThreadPool.class.getName());mergedProps.setProperty(PROP_THREAD_COUNT, Integer.toString(DEFAULT_THREAD_COUNT));}// 加载配置文件中的配置 if (this.configLocation ! null) {if (logger.isDebugEnabled()) {logger.debug(Loading Quartz config from [ this.configLocation ]);}PropertiesLoaderUtils.fillProperties(mergedProps, this.configLocation);}//合并 配置CollectionUtils.mergePropertiesIntoMap(this.quartzProperties, mergedProps);if (this.dataSource ! null) {mergedProps.setProperty(StdSchedulerFactory.PROP_JOB_STORE_CLASS, LocalDataSourceJobStore.class.getName());}// Determine scheduler name across local settings and Quartz properties...if (this.schedulerName ! null) {mergedProps.setProperty(StdSchedulerFactory.PROP_SCHED_INSTANCE_NAME, this.schedulerName);}else {String nameProp mergedProps.getProperty(StdSchedulerFactory.PROP_SCHED_INSTANCE_NAME);if (nameProp ! null) {this.schedulerName nameProp;}else if (this.beanName ! null) {mergedProps.setProperty(StdSchedulerFactory.PROP_SCHED_INSTANCE_NAME, this.beanName);this.schedulerName this.beanName;}}//初始化schedulerFactory.initialize(mergedProps);}调度
quartz使用 SchedulerFactory 来实例化一个 调度器 。
SchedulerFactory
public interface SchedulerFactory {Scheduler getScheduler() throws SchedulerException;Scheduler getScheduler(String schedName) throws SchedulerException;CollectionScheduler getAllSchedulers() throws SchedulerException;}quartz为SchedulerFactory实现了2个实现类。
StdSchedulerFactory创建scheduler的标准工厂。DirectSchedulerFactory 直接创建scheduler的工厂简单的单例实现提供一些便捷方式。没有复杂的配置。
StdSchedulerFactory
创建scheduler的标准工厂。 通常是通过quartz.properties属性配置文件(默认情况下均使用该文件)结合StdSchedulerFactory 来使用Quartz的。StdSchedulerFactory 会加载属性配置文件并实例化一个Scheduler DirectSchedulerFactory
Scheduler
Scheduler 维护了一个 JobDetails 和 Triggers 的注册表。 一旦在 Scheduler 注册过了当定时任务触发时间一到调度程序就会负责执行预先定义的 Job调度程序创建之后处于 “ 待机 ” 状态必须调用 scheduler 的 start() 方法启用调度程序可以使用 shutdown() 方法关闭调度程序使用 isShutdown() 方法判断该调度程序是否已经处于关闭状态 通过 Scheduler.scheduleJob(…) 方法将任务纳入调度程序中当任务触发时间到了的时候该任务将被 执行 quartz的实现类如下 public interface Scheduler {//默认 GroupDEFAULT用于JobTrigger。String DEFAULT_GROUP Key.DEFAULT_GROUP;String DEFAULT_RECOVERY_GROUP RECOVERING_JOBS;/** 用于Trigger */String DEFAULT_FAIL_OVER_GROUP FAILED_OVER_JOBS;String FAILED_JOB_ORIGINAL_TRIGGER_NAME QRTZ_FAILED_JOB_ORIG_TRIGGER_NAME;String FAILED_JOB_ORIGINAL_TRIGGER_GROUP QRTZ_FAILED_JOB_ORIG_TRIGGER_GROUP;String FAILED_JOB_ORIGINAL_TRIGGER_FIRETIME_IN_MILLISECONDS QRTZ_FAILED_JOB_ORIG_TRIGGER_FIRETIME_IN_MILLISECONDS_AS_STRING;String FAILED_JOB_ORIGINAL_TRIGGER_SCHEDULED_FIRETIME_IN_MILLISECONDS QRTZ_FAILED_JOB_ORIG_TRIGGER_SCHEDULED_FIRETIME_IN_MILLISECONDS_AS_STRING;String getSchedulerName() throws SchedulerException;String getSchedulerInstanceId() throws SchedulerException;SchedulerContext getContext() throws SchedulerException;/**Scheduler 创建时的状态为stand-by。不能执行触发器。必须启动之后。*/void start() throws SchedulerException;/**延迟多久启动**/void startDelayed(int seconds) throws SchedulerException; boolean isStarted() throws SchedulerException;/*** 切回 stand-by 模式。*/void standby() throws SchedulerException;boolean isInStandbyMode() throws SchedulerException;/*** 关闭 scheduler。不能再重新启动了。* 等同 shutdown(false)*/void shutdown() throws SchedulerException;/*** param waitForJobsToComplete为true表示一直阻塞 所有任务执行完成。*/void shutdown(boolean waitForJobsToComplete)throws SchedulerException;boolean isShutdown() throws SchedulerException;SchedulerMetaData getMetaData() throws SchedulerException;/** 获取所有正在执行的任务*/ListJobExecutionContext getCurrentlyExecutingJobs() throws SchedulerException;void setJobFactory(JobFactory factory) throws SchedulerException;ListenerManager getListenerManager() throws SchedulerException;/**调度一个任务*/Date scheduleJob(JobDetail jobDetail, Trigger trigger)throws SchedulerException;Date scheduleJob(Trigger trigger) throws SchedulerException;void scheduleJobs(MapJobDetail, Set? extends Trigger triggersAndJobs, boolean replace) throws SchedulerException;void scheduleJob(JobDetail jobDetail, Set? extends Trigger triggersForJob, boolean replace) throws SchedulerException;/**取消调度 */boolean unscheduleJob(TriggerKey triggerKey)throws SchedulerException;boolean unscheduleJobs(ListTriggerKey triggerKeys)throws SchedulerException;Date rescheduleJob(TriggerKey triggerKey, Trigger newTrigger) throws SchedulerException;void addJob(JobDetail jobDetail, boolean replace)throws SchedulerException;void addJob(JobDetail jobDetail, boolean replace, boolean storeNonDurableWhileAwaitingScheduling)throws SchedulerException;boolean deleteJob(JobKey jobKey)throws SchedulerException;boolean deleteJobs(ListJobKey jobKeys)throws SchedulerException;void triggerJob(JobKey jobKey)throws SchedulerException;void triggerJob(JobKey jobKey, JobDataMap data)throws SchedulerException;void pauseJob(JobKey jobKey)throws SchedulerException;void pauseJobs(GroupMatcherJobKey matcher) throws SchedulerException;void pauseTrigger(TriggerKey triggerKey)throws SchedulerException;void pauseTriggers(GroupMatcherTriggerKey matcher) throws SchedulerException;void resumeJob(JobKey jobKey)throws SchedulerException;void resumeJobs(GroupMatcherJobKey matcher) throws SchedulerException;void resumeTrigger(TriggerKey triggerKey)throws SchedulerException;void resumeTriggers(GroupMatcherTriggerKey matcher) throws SchedulerException;void pauseAll() throws SchedulerException;void resumeAll() throws SchedulerException;ListString getJobGroupNames() throws SchedulerException;SetJobKey getJobKeys(GroupMatcherJobKey matcher) throws SchedulerException;List? extends Trigger getTriggersOfJob(JobKey jobKey)throws SchedulerException;ListString getTriggerGroupNames() throws SchedulerException;SetTriggerKey getTriggerKeys(GroupMatcherTriggerKey matcher) throws SchedulerException;SetString getPausedTriggerGroups() throws SchedulerException;JobDetail getJobDetail(JobKey jobKey)throws SchedulerException;Trigger getTrigger(TriggerKey triggerKey)throws SchedulerException;TriggerState getTriggerState(TriggerKey triggerKey)throws SchedulerException;void addCalendar(String calName, Calendar calendar, boolean replace, boolean updateTriggers)throws SchedulerException;boolean deleteCalendar(String calName) throws SchedulerException;Calendar getCalendar(String calName) throws SchedulerException;ListString getCalendarNames() throws SchedulerException;boolean interrupt(JobKey jobKey) throws UnableToInterruptJobException;boolean interrupt(String fireInstanceId) throws UnableToInterruptJobException;boolean checkExists(JobKey jobKey) throws SchedulerException; boolean checkExists(TriggerKey triggerKey) throws SchedulerException;void clear() throws SchedulerException;
}
StdScheduler
标准Scheduler主要功能是通过内部的 QuartzScheduler实现。
附录
参考
http://www.quartz-scheduler.org/documentation/quartz-2.3.0/cookbook/
http://www.quartz-scheduler.org/documentation/quartz-2.3.0/configuration/
配置
主要配置
属性名称必需类型默认值org.quartz.scheduler.instanceNamenostring‘QuartzScheduler’org.quartz.scheduler.instanceIdnostring‘NON_CLUSTERED’org.quartz.scheduler.instanceIdGenerator.classnostring (class name)org.quartz.simpl .SimpleInstanceIdGeneratororg.quartz.scheduler.threadNamenostringinstanceName ‘_QuartzSchedulerThread’org.quartz.scheduler .makeSchedulerThreadDaemonnobooleanfalseorg.quartz.scheduler .threadsInheritContextClassLoaderOfInitializernobooleanfalseorg.quartz.scheduler.idleWaitTimenolong30000org.quartz.scheduler.dbFailureRetryIntervalnolong15000org.quartz.scheduler.classLoadHelper.classnostring (class name)org.quartz.simpl .CascadingClassLoadHelperorg.quartz.scheduler.jobFactory.classnostring (class name)org.quartz.simpl.PropertySettingJobFactoryorg.quartz.context.key.SOME_KEYnostringnoneorg.quartz.scheduler.userTransactionURLnostring (url)‘java:comp/UserTransaction’org.quartz.scheduler .wrapJobExecutionInUserTransactionnobooleanfalseorg.quartz.scheduler.skipUpdateChecknobooleanfalseorg.quartz.scheduler .batchTriggerAcquisitionMaxCountnoint1org.quartz.scheduler .batchTriggerAcquisitionFireAheadTimeWindownolong0
org.quartz.scheduler.instanceName实例名称用来区分特定的调度器实例。org.quartz.scheduler.instanceId实例Id用来区分特定的调度器实例。在集群模式下必须保证唯一。是物理上唯一instanceName是逻辑上的区分。假如想Quartz帮生成这个值的话可以设置为AUTO。org.quartz.scheduler.instanceIdGenerator.class调度器实例id的生成方式只有在调度器示例id设置为Auto自动生成时有效。缺省值org.quartz.simpl.SimpleInstanceIdGenerator。org.quartz.scheduler.threadName调度器的线程名称默认使用instanceName’_QuartzSchedulerThread’org.quartz.scheduler.makeSchedulerThreadDaemon是否将schedule主线程设置为守护线程默认falseorg.quartz.scheduler.threadsInheritContextClassLoaderOfInitializerQuartz生成的线程是否继承初始化线程的上下文类加载器默认falseorg.quartz.scheduler.idleWaitTime在调度程序空闲时重复查询是否有可用触发器的等待时间默认30000(毫秒)org.quartz.scheduler.dbFailureRetryIntervalJobStore 模式下连接超时重试连接的间隔默认15000(毫秒)org.quartz.scheduler.classLoadHelper.class类加载帮助类默认org.quartz.simpl.CascadingClassLoadHelperorg.quartz.scheduler.jobFactory.class指定JobFactory的类(接口)名称负责实例化jobClass默认值为org.quartz.simpl.PropertySettingJobFactoryorg.quartz.context.key.SOME_KEY代替 “scheduler context” 的一些配置。“org.quartz.context.key.MyKey MyValue” 等价于 scheduler.getContext().put(“MyKey”, “MyValue”). 事务相关属性应该被排除在配置文件之外除非使用的是JTA事务org.quartz.scheduler.userTransactionURL设置Quartz能够加载UserTransaction的JNDI的 URL。org.quartz.scheduler.wrapJobExecutionInUserTransaction是否在Quartz执行一个job前使用UserTransactionorg.quartz.scheduler.skipUpdateCheck在程序运行前检查quartz是否有版本更新默认falseorg.quartz.scheduler.batchTriggerAcquisitionMaxCount允许调度程序一次性触发的触发器数量默认值1。1、值越大表示允许触发的任务越多2、如果值大于1时需要设置org.quartz.jobStore.acquireTriggersWithinLock属性为true以避免多个触发器产生的数据混乱。org.quartz.scheduler.batchTriggerAcquisitionFireAheadTimeWindow允许触发器被获取并在其预定的触发时间之前触发的数量默认数量为0
线程池配置
org.quartz.threadPool.class线程池的实现类一般默认使用org.quartz.simpl.SimpleThreadPool(固定大小)实例。org.quartz.threadPool.threadCount线程池中的线程数量默认10。如果仅几个任务建议1如果上万个建议50–100。org.quartz.threadPool.threadPriority线程的优先级默认5。最小优先级1最高10。org.quartz.threadPool.makeThreadsDaemons是否设置为守护线程默认false。org.quartz.threadPool.threadsInheritGroupOfInitializingThread加载任务的代码的ClassLoader是否从外部继承默认trueorg.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThreadorg.quartz.threadPool.threadNamePrefix线程默认的前缀默认Worker 。 如果是自定义的线程池则可以设置自定义的属性值 org.quartz.threadPool.class MyThreadPool
org.quartz.threadPool.attr1 someValue //MyThreadPool的属性attr1 的值
org.quartz.threadPool.attr2 someValue //MyThreadPool的属性attr2 的值RAMJobStore
org.quartz.jobStore.class org.quartz.simpl.RAMJobStore
org.quartz.jobStore.misfireThreshold最大能忍受的触发超时时间默认值60000(毫秒)超时则认为失误。
数据连接配置
quartz框架中数据源相关的配置属性的统一前缀为org.quartz.jobStore. classjob的存储方式可以选择存储在内存中或者持久化数据库中默认为null org.quartz.simpl.RAMJobStore 即存储在内存中不适用配置文件时默认值org.quartz.impl.jdbcjobstore.JobStoreTX 表示选择JDBC存储方式自己管理事务org.quartz.impl.jdbcjobstore.JobStoreCMT也表示JDBC但是由全局JTA管理事务 driverDelegateClass用于处理不同数据库之间差异的实现类默认null 使用mysql jdbc数据存储时设置为为org.quartz.impl.jdbcjobstore.StdJDBCDelegate dataSource配置数据源的名称默认null 如果不配置数据源名称可以使用spring配置文件中的数据源并在scheduler创建时注入如果此处配置了数据源的名称可以进一步在quartz文件中配置数据源信息 # 配置数据源名称dataSorucedataSourceName
org.quartz.dataSource.dataSourceName.driver
org.quartz.dataSource.dataSourceName.URL
org.quartz.dataSource.dataSourceName.user
org.quartz.dataSource.dataSourceName.password
org.quartz.dataSource.dataSourceName.maxConnectionstablePrefix表示quartz定时任务持久化时对应的数据表前缀默认值QRTZ_ misfireThreshold最大能忍受的触发超时时间默认值60000超时则认为失误 useProperties使用key-value的形式存储JobDataMap默认true 指示JDBCJobStore所有的JobDataMaps中的值都是字符串并且能以“名字-值”对的方式存储而不是以复杂对象的序列化形式存储在BLOB字段中应该设置为true isClustered是否以集群方式运行默认false 如果多个quartz实例使用同一个数据库则需要设置为true否则会报错 clusterCheckinInterval检入到数据库中的频率默认20000 maxMisfiresToHandleAtATimeJobStore处理未按时触发的Job数量默认20 dontSetAutoCommitFalse事务是否自动提交默认false selectWithLockSQL配置加锁的SQL语句默认false需要配置时默认语句是 SELECT * FROM [tableName] LOCKS WHERE LOCK_NAME ? FOR UPDATEtxIsolationLevelSerializable是否使用事务隔离级别中的可序列化默认falseacquireTriggersWithinLock触发事务前是否需要拥有锁默认truelockHandler.class用于管理数据库中相关锁机制的类名默认null
Jdbc存储表结构
qrtz_blob_triggers以blob格式存放自定义trigger信息qrtz_calendars记录quartz任务中的日历信息qrtz_cron_triggers记录cronTrigger即cron表达式相关触发器的信息qrtz_fired_triggers存储正在触发的定时器的信息执行完后数据清空qrtz_job_details记录每个定时任务详细信息的表qrtz_locks分布式处理时多个节点定时任务的锁信息qrtz_paused_triggers_grps存储暂停的任务触发器信息qrtz_scheduler_state记录调度器状态的表qrtz_simple_triggers记录SimpleTrigger即普通的触发器信息qrtz_simprop_triggers存储CalendarIntervalTrigger和DailyTimeIntervalTrigger触发器信息qrtz_triggers记录每个触发器详细信息的表
