Scheduler相关组件

提示:本文中部分内容图片节选自互联网,无意冒犯。如有侵权请私信联系作者即刻删除、更改。



Scheduler调度器

Scheduler为Quartz调用任务的核心模块,它是调度程序与主程序交互的接口。用于调度触发器和具体的任务绑定。并管理任务的运行和状态的切换。他们三者的关系如下:
在这里插入图片描述
如图可知:一个Job可以对应对各Trigger,但是一个Trigger只能对应一个Job。所以如果需要完成一个复杂的任务调度可以创建一组Trigger去关联一个Job实例。

ScheduleFactory

Scheduler由ScheduleFactory创建,并且关联Trigger域Job实例。创建Scheduler的方式有两种:

  1. 使用StdSchedulerFactory
    StdSchedulerFactory是Quartz默认的ScheduleFactory. 它使用一组属性来创建和初始化Quartz的Scheduler实例。属性通常存储在文件中,但也可以由程序创建(java.util.Properties)对象并直接传递到工厂类实例。

    final SchedulerFactory schedulerFactory = new StdSchedulerFactory();
    final Scheduler scheduler = schedulerFactory.getScheduler();
    
  2. DirectSchedulerFactory
    DirectSchedulerFactory用于编程式的创建Scheduler实例。通常不鼓励使用它,因为DirectSchedulerFactory要求用户比较了解Quartz。它不允许使用配置文件,你需要硬编码Scheduler实例的所有属性项。所以了解即可,无须演示。

Scheduler

Scheduler接口规定了调度器必要的行为规范,其源码如下:

//默认组"DEFAULT",用于指定Job和Trigger实例属于那个组。
String DEFAULT_GROUP = Key.DEFAULT_GROUP;
//调度器内部使用的Trigger组名称,外部不应该使用
String DEFAULT_RECOVERY_GROUP = "RECOVERING_JOBS";
String DEFAULT_FAIL_OVER_GROUP = "FAILED_OVER_JOBS";
//该常量是一个JobDataMap的key,用于在scheduler失败之后恢复工作的job数据映射中获取最初触发器的名称
String FAILED_JOB_ORIGINAL_TRIGGER_NAME =  "QRTZ_FAILED_JOB_ORIG_TRIGGER_NAME";
//同上不过是用来恢复Trigger组的key
String FAILED_JOB_ORIGINAL_TRIGGER_GROUP =  "QRTZ_FAILED_JOB_ORIG_TRIGGER_GROUP";
//该常量是一个JobDataMap的key,用于在scheduler失败之后恢复工作的job数据映射中获取最初触发器的执行时间
//需注意:最初的执行时间和调度执行是不同的,因为执行时间不精确
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";

以上为Scheduler接口中包含的静态常量。一些常用的方法如下:

//获取描述scheduler设置和能力的SchedulerMetaData对象
//注意返回的是一个瞬时快照,调用即会返回,但是数据可能会不同
SchedulerMetaData getMetaData() throws SchedulerException;
boolean isShutdown() throws SchedulerException;
//如果参数为true将等待被触发任务完成才会shutdown
void shutdown(boolean waitForJobsToComplete)
        throws SchedulerException;
//停止scheduler中所有触发中的trigger,并清除所有相关资源等同于shutdown(false)
//并且被shutdown的scheduler不能被start
void shutdown() throws SchedulerException;
//报告scheduler是否处于等待模式
boolean isInStandbyMode() throws SchedulerException;
//暂停调度器中对应的trigger
//当调度器的start被调用(这个scheduler会退出等待模式),
//期间trigger任何错误指令都会被JobStore的正常进程检测,并不会被执行
void standby() throws SchedulerException;
boolean isStarted() throws SchedulerException;
//启动调度器
void start() throws SchedulerException;
void startDelayed(int seconds) throws SchedulerException;

由以上方法可知一个Scheduler对象在实例化之后调用start()方法之前处于待机状态、调用start()为启动状态,此时可以调度Trigger触发对应的Job。当调用standby()方法Scheduler将会被暂停,但是可以通过start()方法将其唤醒。当任务完成即可调用Scheduler的shutdown()方法,清理一切与此Scheduler的相关资源。
注意:scheduler被停止后,除非重新实例化,否则不能重新启动;
除以上常用的API之外,Scheduler包含的方法还有很多。如:添加任务、添加触发器、获取任务、监听器等方法,可自行参考API。此外还有一些其他Api如下:

String getSchedulerName() throws SchedulerException;

String getSchedulerInstanceId() throws SchedulerException;

/**
 * Returns the <code>SchedulerContext</code> of the <code>Scheduler</code>.
 */
SchedulerContext getContext() throws SchedulerException;
Set<TriggerKey> getTriggerKeys(GroupMatcher<TriggerKey> matcher) throws SchedulerException;
Set<String> getPausedTriggerGroups() throws SchedulerException;
JobDetail getJobDetail(JobKey jobKey)
        throws SchedulerException;
Trigger getTrigger(TriggerKey triggerKey)
        throws SchedulerException;
Trigger.TriggerState getTriggerState(TriggerKey triggerKey)
        throws SchedulerException;
//重置当前处于TriggerState#ERROR状态下的Trigger的状态为TriggerState#NORMAL或者TriggerState#PAUSED
//该方法只适用于TriggerState#ERROR状态下 trigger否则调用的结果是no-op
//一般调用该方法trigger的装填会改变为TriggerState#NORMAL。
// 除非它的trigger group是暂停状态那么trigger的状态会改变为TriggerState#PAUSED
void resetTriggerFromErrorState(TriggerKey triggerKey)
        throws SchedulerException;
//该方法用于中断一个正在执行的Job,并且被中断的job必需实现InterruptableJob接口。该方法不支持集群
//如果当前执行的符合条件的任务有多个,他们的interrupt方法将都会被调用。
//如果其中有一个job发生异常则以后的job的interrupt都不会被执行
boolean interrupt(JobKey jobKey) throws UnableToInterruptJobException;
//该方法用于中断一个正在执行的Job,并且被中断的job必需实现InterruptableJob接口。该方法不支持集群
boolean interrupt(String fireInstanceId) throws UnableToInterruptJobException;
boolean checkExists(JobKey jobKey)
//判断此Trigger是否存在
boolean checkExists(TriggerKey triggerKey) throws SchedulerException;
//删除所有的调度数据(job和Trigger)
void clear() throws SchedulerException;

properties

由前边介绍可知StdSchedulerFactory 会加载属性配置文件并实例化一个Scheduler。默认情况下,Quartz会加载所属项目下的classpath中的quartz.properties文件作为配置属性。如果找不到,则会使用quartz.jar下的org/quartz/quartz.properties文件。
如果想要自定义配置文件路径可以在调用getScheduler()方法之前,使用StdSchedulerFactory # initialize(xx)初始化factory属性的配置文件。或者通过配置org.quartz.properties属性指定配置文件路径以及使用硬编码的方式进行配置。如下例:

public static void main(String[] args) throws SchedulerException {
    final StdSchedulerFactory schedulerFactory = new StdSchedulerFactory();
    final Properties properties = new Properties();
    properties.put("org.quartz.scheduler.instanceName","schedulerFactory");
    schedulerFactory.initialize(properties);
    final Scheduler scheduler = schedulerFactory.getScheduler();
    ...
    scheduler.start();
}

quartz.properties中可以配置的属性分为四类:调度器属性、线程池属性、作业存储设置、插件配置。

调度器属性

用于配置区分Scheduler的属性标识。其配置名称都以org.quartz.scheduler.XXX为前缀,并且都不是必须的因为它们都具有默认值。常用的配置如下

  • instaceName
    配置Scheduler的名称用于区分多个实例。
    此属性为String类型,默认值为QuartzScheduler。
  • instanceId
    用于标识Scheduler唯一标识,特别时在集群环境中。推荐使用AUTO作为此配置的值,也可以使用系统维护配置的值为SYS_PROP。此时会有Quartz进行维护不会导致instanceId冲突。
    此属性为String类型,默认值为NON_CLUSTERED。
  • instanceIdGenerator.class
    用于指定instanceId的生成策略。
    此属性为String类型(需要是类的全限定名),默认值为org.quartz.simpl.SimpleInstanceIdGenerator。仅当instanceId设置为AUTO时才使用。它根据主机名和时间戳生成实例ID。
    当然也可以选用其他IntanceIdGenerator实现。如SystemPropertyInsta-nceIdGenerator(搭配SYS_PROP标识从系统属性获取实例ID)。并且Quartz还允许自定义InstanceIdGenerator接口的实现类。
  • threadName
    可以是java线程的有效名称的任何字符串。此属性为String类型,默认值为instanceName+ ‘_QuartzSchedulerThread’。
  • makeSchedulerThreadDaemon
    指定调度程序的主线程是否应该是守护线程。此属性为boolean类型,默认值为false。
  • threadsInheritContextClassLoaderOfInitializer
    用于指定Quartz产生的线程是否会继承初始化Quartz实例的线程的上下文ClassLoader。 如果使用JDBCJobStore,它会影响Quartz的调度线程,如果使用集群它会影响集群恢复线程、如果使用SimpleThreadPool它会影响SimpleThreadPool中的线程。
    此属性为boolean类型,默认值为false。将此值设置为true有助于类加载,JNDI查找以及与应用程序服务器中使用Quartz相关的其他问题。
  • idleWaitTime
    用于指定调度程序处于空闲状态时,重新查询可用触发器之前等待的时间量。不推荐修改此属性。并且此配置不应该小于5000,因为它会导致过多的数据库查询。 小于1000的价值不合法。
    此属性为long类型,以毫秒为单位,默认值为30000。
  • dbFailureRetryInterval
    用于配置调度程序在检测到JobStore(例如数据库)之间的连接丢失时,会在重新尝试之间等待的时间量。使用RAMJobStore时此参数无效。
    此属性为long类型,以毫秒为单位,默认值为15000。
  • classLoadHelper.class
    使用此配置是因为Quartz运行的不同环境(例如不同的应用服务器、独立的、移动设备等)之间的类加载器行为存在很大差异。为提升性能需要此属性配置的类寻找合适的类加载器配置。
    此属性为String类型(需要是类的全限定名),默认值为org.quartz.simpl.CascadingClassLoadHelper。它依次org.quartz.simpl包中的所有ClassLoadHelper类,直到配匹到一个能处理的ClassLoadHelper类。它将被提升到下次加载类时首先使用的方案(为了提高性能)。
  • jobFactory.class
    指定要使用的JobFactory的类名。 JobFatcory负责生成JobClasses的实例。
    此属性为String类型(需要是类的全限定名),默认值为org.quartz.simpl.PropertySettingJobFactory。它只需在类上调用newInstance()即可在每次执行即将发生时生成一个新的实例。PropertySettingJobFactory还使用SchedulerContext中JobDataMaps的内容来记录Job bean中的属性。
  • userTransactionURL
    此配置应设置为Quartz可以找到Application Server的UserTransaction管理器的JNDI URL。
    此属性为String类型,默认值为java:comp/UserTransaction。几乎适用于所有应用程序服务器。 Websphere用户可能需要将此属性设置为jta / usertransaction。 仅当Quartz配置为使用JobStoreCMT,并将wrapJobExecutionInUserTransaction设置为true时才使用此操作。
  • wrapJobExecutionInUserTransaction
    此配置用于设置是否在Quartz的工作调用执行之前启动UserTransaction
    此属性为boolean类型,默认值为false。如果设置为true,UserTransaction启动在Quartz的工作调用执行之前。在作业执行方法完成后,JobDataMap更新后(如果它是StatefulJob),Tx将提交。它的效果与@ExecuteInJTATransaction注解在单个Job中的作用相同。
  • skipUpdateCheck
    是否跳过运行快速Web请求以确定是否有可更新的Quartz版本可供下载。 如果检查运行,并且找到更新,则会在Quartz的日志中报告它。可以设置配置的值为true禁用更新,建议禁用生产部署的更新检查。
    此属性为boolean类型,默认值为false。
  • batchTriggerAcquisitionMaxCount
    允许调度程序节点一次获取用于触发的触发器的最大数量。数字越大,触发效率越高.但是这个值可能会导致群集节点之间可能的不平衡负载为代价。
    此属性为int类型,默认值为1。如果此属性的值设置为> 1,并使用JDBCJobStore,则必须将属性org.quartz.jobStore.acquireTriggersWithinLock设置为true以避免数据损坏。
  • batchTriggerAcquisitionFireAheadTimeWindow
    允许触发器在其预定的触发时间之前被获取和触发的时间的时间量。数量越大,触发器触发器的批次获取越有可能一次可以选择和触发超过1个触发器 - 以触发计划为代价不准确地被触发(触发器可能会提早启动该数量)。 在调度程序具有非常大数量的触发器需要在或接近同一时间点触发的情况下,这可能是有用的(为了表现的缘故)。
    此属性为long类型,以毫秒为单位,默认值为0。
  • org.quartz.context.key.SOME_KEY
    此配置的内容与名称将作为名称–值对字符串放入调度程序上下文。例如,设置org.quartz.context.key.oneKey =value与scheduler.getContext().put(“oneKe-y”,“value”)等效。
    此属性为String类型,默认值为none。需要注意使用JTA事务除外,因为事务相关属性应该不在配置文件中。

线程池属性

线程池属性配置了线程池相关的一些配置,它们都以org.quartz.threadPool.XXX开头。其中有两个必填选项:

  • class
    配置想要使用的ThreadPool的全限定名。 Quartz附带的线程池是org.quartz.simpl.SimpleThreadPool,它已经足够Quartz任务的使用,所以使用即可。池中的线程越多,并发运行的jobs数越多。一般5个左右的线程即可。
    除了保持线程数量尽可能小之外,还需要保证Jobs按时启动。请注意,如果triggers的触发时间到达,并且没有可用的线程,Quartz将阻止(暂停)直到线程可用,然后jobs将执行。但是这可能会导致任务执行的失败,当等待时间到达间隔事件的阙值。
    此属性为String类型(需要是类的全限定名),必填,默认值为null。
  • threadCount
    配置可用于并发执行作业的线程数,应该是大于0的正整数。
    此属性为int类型,必填,默认值为-1。
  • threadPriority
    设置线程的优先级。可以1~10之间的任何值。
    此属性为int类型,默认值为5。
    下边是一些关于SimpleThreadPool 特定的属性配置
  • makeThreadsDaemons
    设置线程是否为守护线程。
    此属性为boolean类型,默认值为false。意味着线程池中的线程为非守护线程。
  • threadNamePrefix
    在工作池中的线程名称的前缀将被附加一个数字。
    此属性为String类型,默认值[Scheduler Name]_Worker。
    作业存储属性
    此配置模块用于设置作业存储相关的属性。如全局监听器,RMI、JobStore相关配置。如下为Listener相关配置它们以org.quartz.XXXListener.XXX为前缀
#配置全局TriggerListener
org.quartz.triggerListener.NAME.class = com.dazhewan.MyTriggerListener
org.quartz.triggerListener.NAME.propName = propValue
org.quartz.triggerListener.NAME.prop2Name = prop2Value
#配置全局JobListener
org.quartz.jobListener.NAME.class = com.dazhewan.MyJobListener
org.quartz.jobListener.NAME.propName = propValue
org.quartz.jobListener.NAME.prop2Name = prop2Value

RAMJobStore相关属性

org.quartz.jobStore.class用于执行使用哪种JobStroe作为调度数据的存储策略。
org.quartz.jobStore.misfireThreshold用于设置失败临界值,或者临界时间。此选项的默认值为60s,默认配置的单位是毫秒。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值