quartz配置文件中可以通过以下两种配置读取方式
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore(从内存中读取定时任务)
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX(从数据库中读取定时任务)
以JobStoreTX为例,它最核心的组成部分是Scheduler、Trigger、JobDetail,然后给Scheduler配置个线程QuartzSchedulerThread,此线程在服务器启动时初始化Scheduler时启动,等待Scheduler start,然后从JobStore里拿到最近要触发的Trigger。
Scheduler:接口定义了对定时任务主要操作方法。
Trigger:定时器定义了任务执行时间。
JobDetail:定时任务一个JobDetail可以配置多个Trigger,主要定义了定时执行的类,方法,参数等信息。
任务定时执行:在服务器启动以后,每隔几秒至几十秒就会轮询StdJDBCDelegate类中selectTriggerToAcquire方法,执行sql查询qrtz_triggers表中NEXT_FIRE_TIME(下次触发时间)字段符合当前时间段并且TRIGGER_STATE状态为WAITING(等待中),符合此条件的Trigger查询出来,关联jobDetail来得到配置参数,调用配置好的业务方法。
ps = conn.prepareStatement(rtp(SELECT_NEXT_TRIGGER_TO_ACQUIRE));
// Try to give jdbc driver a hint to hopefully not pull over
// more than the few rows we actually need.
ps.setFetchSize(5);
ps.setMaxRows(5);
ps.setString(1, STATE_WAITING);
ps.setBigDecimal(2, new BigDecimal(String.valueOf(noLaterThan)));
ps.setBigDecimal(3, new BigDecimal(String.valueOf(noEarlierThan)));
rs = ps.executeQuery();
while (rs.next() && nextTriggers.size() < 5) {
nextTriggers.add(new Key(
rs.getString(COL_TRIGGER_NAME),
rs.getString(COL_TRIGGER_GROUP)));
}
return nextTriggers;
TRIGGER_STATE的更新:每次查找到匹配的Trigger,执行调度任务的同时,通过StdJDBCDelegate类的updateTriggerStateFromOtherState方法来更新TRIGGER_STATE状态为ACQUIRED(运行中),在执行完定时调度的业务方法时,将TRIGGER_STATE状态为WAITING(等待中)。
ps = conn.prepareStatement(rtp(UPDATE_TRIGGER_STATE_FROM_STATES));
ps.setString(1, newState);
ps.setString(2, triggerName);
ps.setString(3, groupName);
ps.setString(4, oldState1);
ps.setString(5, oldState2);
ps.setString(6, oldState3);
return ps.executeUpdate();
NEXT_FIRE_TIME的更新:在暂停、恢复任务状态或是每次时间轮询时都会判断NEXT_FIRE_TIME值是否小于当前时间,如果小于当前时间将永远不会执行,所以quartz会自动通过表达式来计算,参照当前时间来计算下次执行时间,执行updateTrigger方法更新NEXT_FIRE_TIME,或是每次查找到匹配的Trigger,执行调度任务的同时也会更新NEXT_FIRE_TIME下次运行时间。
if(updateJobData) {
ps = conn.prepareStatement(rtp(UPDATE_TRIGGER));
} else {
ps = conn.prepareStatement(rtp(UPDATE_TRIGGER_SKIP_DATA));
}
ps.setString(1, trigger.getJobName());
ps.setString(2, trigger.getJobGroup());
setBoolean(ps, 3, trigger.isVolatile());
ps.setString(4, trigger.getDescription());
long nextFireTime = -1;
if (trigger.getNextFireTime() != null) {
nextFireTime = trigger.getNextFireTime().getTime();
}
ps.setBigDecimal(5, new BigDecimal(String.valueOf(nextFireTime)));
long prevFireTime = -1;
if (trigger.getPreviousFireTime() != null) {
prevFireTime = trigger.getPreviousFireTime().getTime();
}
ps.setBigDecimal(6, new BigDecimal(String.valueOf(prevFireTime)));
ps.setString(7, state);
if (trigger instanceof SimpleTrigger && ((SimpleTrigger)trigger).hasAdditionalProperties() == false ) {
// updateSimpleTrigger(conn, (SimpleTrigger)trigger);
ps.setString(8, TTYPE_SIMPLE);
} else if (trigger instanceof CronTrigger && ((CronTrigger)trigger).hasAdditionalProperties() == false ) {
// updateCronTrigger(conn, (CronTrigger)trigger);
ps.setString(8, TTYPE_CRON);
} else {
// updateBlobTrigger(conn, trigger);
ps.setString(8, TTYPE_BLOB);
}
ps.setBigDecimal(9, new BigDecimal(String.valueOf(trigger
.getStartTime().getTime())));
//代码略......
注意:在调试和测试quartz时,在局域网下如果没有做服务器集群,多个人启动了多台服务器,连接到同一台数据库服务器时会出现问题,因为quartz是多线程的,通过数据表记录来获得执行的任务,当多台服务器异步更新和读取的时候就会造成数据读取不同步问题,而出现bug。解决办法就是,测试时自己单独使用一个数据库,或是修改配置文件让其他人通过RAMJobStore读取,这样就不会造成多台机器同时读取一个库的问题发生了。
分享到:
相关推荐
quartz集群调度机制调研及源码分析,基于quartz 1.7版本
深入解读Quartz的原理,定时任务框架是web开发过程中使用很多的框架之一
Quartz 批量下载源码,Quartz 批量下载源码Quartz 批量下载源码Quartz 批量下载源码Quartz 批量下载源码Quartz 批量下载源码Quartz 批量下载源码Quartz 批量下载源码Quartz 批量下载源码Quartz 批量下载源码
Quartz原理及实例,spring4.x+Quartz.2.2.1结合的开发,静态和动态实例
Quartz是一个开源的作业调度框架,它完全由Java写成,并设计用于J2SE和J2EE应用中。它提供了巨大的灵 活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度 What's New In Quartz Scheduler ...
C# quartz.net 定时任务源码,实现了远程操控.动态追加dll,可以安装到windows服务中.
Quartz.NET 官方源码及演示例子,官方下载地址:http://sourceforge.net/projects/quartznet/files/quartznet/
Quartz.NET 官方源码
本项目中包含实验过得一些例子,对于初学Quartz来说很有帮助.
quartz-1.6.4.源码 src source 11111111111111111111111
Quartz 开发指南(附源码)Quartz 开发指南(附源码)Quartz 开发指南(附源码)Quartz 开发指南(附源码)
Quartz.NET Demo 项目源码,包括所需要的DLL、时间调度配置文档
quartz1.6.0源码包 网上只此一家,不要犹豫了
quartz工作原理
org.quartz.tool包源码,使用方法请搜索《 quartz-2.2.1定制工具类,方便nutz使用js配置quartz》
Quartz.NET定时任务源码 Quartz.NET定时任务源码 Quartz.NET定时任务源码 Quartz.NET定时任务源码
.net 简单任务调度平台,用于.net dll,exe的任务的挂载,任务的隔离,调度执行,访问权限控制,监控,管理,日志,错误预警,性能分析等
Quartz,集群,配置,源码,多线程 已经打包成jar包,解压即用,十分方便。 有问题请联系QQ:9710846
quartz .net 源码,可以编译,对需要了解.net 版quartz的大有益处。
QuartZ源码包