- 浏览: 952039 次
文章分类
- 全部博客 (428)
- Hadoop (2)
- HBase (1)
- ELK (1)
- ActiveMQ (13)
- Kafka (5)
- Redis (14)
- Dubbo (1)
- Memcached (5)
- Netty (56)
- Mina (34)
- NIO (51)
- JUC (53)
- Spring (13)
- Mybatis (17)
- MySQL (21)
- JDBC (12)
- C3P0 (5)
- Tomcat (13)
- SLF4J-log4j (9)
- P6Spy (4)
- Quartz (12)
- Zabbix (7)
- JAVA (9)
- Linux (15)
- HTML (9)
- Lucene (0)
- JS (2)
- WebService (1)
- Maven (4)
- Oracle&MSSQL (14)
- iText (11)
- Development Tools (8)
- UTILS (4)
- LIFE (8)
最新评论
-
Donald_Draper:
Donald_Draper 写道刘落落cici 写道能给我发一 ...
DatagramChannelImpl 解析三(多播) -
Donald_Draper:
刘落落cici 写道能给我发一份这个类的源码吗Datagram ...
DatagramChannelImpl 解析三(多播) -
lyfyouyun:
请问楼主,执行消息发送的时候,报错:Transport sch ...
ActiveMQ连接工厂、连接详解 -
ezlhq:
关于 PollArrayWrapper 状态含义猜测:参考 S ...
WindowsSelectorImpl解析一(FdMap,PollArrayWrapper) -
flyfeifei66:
打算使用xmemcache作为memcache的客户端,由于x ...
Memcached分布式客户端(Xmemcached)
Quartz的使用:http://donald-draper.iteye.com/blog/2321886
Quartz的Scheduler初始化源码分析:http://donald-draper.iteye.com/blog/2322730
Quartz的job、触发器的暂停与恢复源码分析:http://donald-draper.iteye.com/blog/2322823
Quartz的Job存储,触发器、任务删除,源码分析:http://donald-draper.iteye.com/blog/2322725
Quartzs的job,trriger监听器源码分析:http://donald-draper.iteye.com/blog/2322863
Quartz 任务存储JobStoreTX 持久化之RDB:http://donald-draper.iteye.com/blog/2323297
Quartz 任务存储JobStoreTX 持久化之RDB-源码分析:http://donald-draper.iteye.com/blog/2323409
Quartz任务调度源码分析:http://donald-draper.iteye.com/blog/2323118
Spring与Quartz集成详解:http://donald-draper.iteye.com/blog/2323591
Spring与Quartz集成-源码分析:http://donald-draper.iteye.com/blog/2324132]
由于前面QuartzScheduler已经介绍过,我们这里直接看代码
//job存储器
//TriggerKey,JobKey包装类
总结:
调度器暂停和恢复trriger,是通过改变triggersByKey中TriggerWrapper的TrrgerKey为trrigerKey的状态,暂定和恢复job是通过暂停和恢复triggers容器中JobKey为jobKey的TriggerWrapper。
Quartz的Scheduler初始化源码分析:http://donald-draper.iteye.com/blog/2322730
Quartz的job、触发器的暂停与恢复源码分析:http://donald-draper.iteye.com/blog/2322823
Quartz的Job存储,触发器、任务删除,源码分析:http://donald-draper.iteye.com/blog/2322725
Quartzs的job,trriger监听器源码分析:http://donald-draper.iteye.com/blog/2322863
Quartz 任务存储JobStoreTX 持久化之RDB:http://donald-draper.iteye.com/blog/2323297
Quartz 任务存储JobStoreTX 持久化之RDB-源码分析:http://donald-draper.iteye.com/blog/2323409
Quartz任务调度源码分析:http://donald-draper.iteye.com/blog/2323118
Spring与Quartz集成详解:http://donald-draper.iteye.com/blog/2323591
Spring与Quartz集成-源码分析:http://donald-draper.iteye.com/blog/2324132]
由于前面QuartzScheduler已经介绍过,我们这里直接看代码
public class QuartzScheduler implements RemotableQuartzScheduler { //暂停触发器 public void pauseTrigger(TriggerKey triggerKey) throws SchedulerException { //检查调度器状态,是否关闭 validateState(); //暂停triggerKey resources.getJobStore().pauseTrigger(triggerKey); //通知调度器下一刻调度时间 notifySchedulerThread(0L); //添加trigger暂定事件到调度监听器 notifySchedulerListenersPausedTrigger(triggerKey); } //恢复触发器 public void resumeTrigger(TriggerKey triggerKey) throws SchedulerException { //检查调度器状态,是否关闭 validateState(); //恢复触发器triggerKey resources.getJobStore().resumeTrigger(triggerKey); ////通知调度器下一刻调度时间 notifySchedulerThread(0L); //添加trigger恢复事件到调度监听器 notifySchedulerListenersResumedTrigger(triggerKey); } //暂定job public void pauseJob(JobKey jobKey) throws SchedulerException { validateState(); //暂定job,关键 resources.getJobStore().pauseJob(jobKey); notifySchedulerThread(0L); 添加job暂定事件到调度监听器 notifySchedulerListenersPausedJob(jobKey); } //恢复job public void resumeJob(JobKey jobKey) throws SchedulerException { validateState(); //恢复job,关键 resources.getJobStore().resumeJob(jobKey); notifySchedulerThread(0L); //添加job恢复事件到调度监听器 notifySchedulerListenersResumedJob(jobKey); } //检查调度器状态,是否关闭 public void validateState() throws SchedulerException { if(isShutdown()) throw new SchedulerException("The Scheduler has been shutdown."); else return; } private static String VERSION_MAJOR; private static String VERSION_MINOR; private static String VERSION_ITERATION; private QuartzSchedulerResources resources; private QuartzSchedulerThread schedThread; private ThreadGroup threadGroup; private SchedulerContext context; private ListenerManager listenerManager;//监听管理器 private HashMap internalJobListeners; private HashMap internalTriggerListeners; private ArrayList internalSchedulerListeners; private JobFactory jobFactory; ExecutingJobsManager jobMgr; ErrorLogger errLogger; private SchedulerSignaler signaler; private Random random; private ArrayList holdToPreventGC; private boolean signalOnSchedulingChange; private volatile boolean closed; private volatile boolean shuttingDown; private boolean boundRemotely; private QuartzSchedulerMBean jmxBean; private Date initialStart; private final Timer updateTimer; }
//job存储器
public class RAMJobStore implements JobStore { //暂停触发器 public void pauseTrigger(TriggerKey triggerKey) { TriggerWrapper tw; label0: { //获取锁 synchronized(lock) { tw = (TriggerWrapper)triggersByKey.get(triggerKey); if(tw != null && tw.trigger != null) break label0; } return; } if(tw.state != 3) break MISSING_BLOCK_LABEL_44; obj; JVM INSTR monitorexit ; return; //如果处于阻塞状态,则triggerKey为暂停阻塞,否则置为暂停状态 if(tw.state == 5) tw.state = 6; else tw.state = 4; //并从timeTriggers移除 timeTriggers.remove(tw); obj; JVM INSTR monitorexit ; goto _L1 exception; throw exception; _L1: } public void resumeTrigger(TriggerKey triggerKey) { TriggerWrapper tw; label0: { synchronized(lock) { tw = (TriggerWrapper)triggersByKey.get(triggerKey); if(tw != null && tw.trigger != null) break label0; } return; } OperableTrigger trig; trig = tw.getTrigger(); if(tw.state == 4 || tw.state == 6) break MISSING_BLOCK_LABEL_59; obj; JVM INSTR monitorexit ; return; //如果blockedJobs包含取法任务,则则triggerKey为阻塞,否则置为等待状态 if(blockedJobs.contains(trig.getJobKey())) tw.state = 5; else tw.state = 0; applyMisfire(tw); //如果调度器状态为等待,则加入到调度容器中 if(tw.state == 0) timeTriggers.add(tw); obj; JVM INSTR monitorexit ; goto _L1 exception; throw exception; _L1: } //暂定job public void pauseJob(JobKey jobKey) { synchronized(lock) { //获取触发任务 List triggersOfJob = getTriggersForJob(jobKey); OperableTrigger trigger; //关键调用pauseTrigger(TriggerKey triggerKey) for(Iterator i$ = triggersOfJob.iterator(); i$.hasNext(); pauseTrigger(trigger.getKey())) trigger = (OperableTrigger)i$.next(); } } //恢复job public void resumeJob(JobKey jobKey) { synchronized(lock) { //获取触发任务 List triggersOfJob = getTriggersForJob(jobKey); OperableTrigger trigger; //调resumeTrigge() for(Iterator i$ = triggersOfJob.iterator(); i$.hasNext(); resumeTrigger(trigger.getKey())) trigger = (OperableTrigger)i$.next(); } } //获取jobkey的触发任务 public List getTriggersForJob(JobKey jobKey) { ArrayList trigList = new ArrayList(); synchronized(lock) { Iterator i$ = triggers.iterator(); do { if(!i$.hasNext()) break; TriggerWrapper tw = (TriggerWrapper)i$.next(); if(tw.jobKey.equals(jobKey)) trigList.add((OperableTrigger)tw.trigger.clone()); } while(true); } return trigList; } protected HashMap jobsByKey;//HashMap<JobKey,JobWrapper> protected HashMap triggersByKey;//HashMap<TrrigerKey,TriggerWrapper> protected HashMap jobsByGroup;//HashMap<String,HashMap<JobKey,JobWrapper>>,,key为JobKey.group protected HashMap triggersByGroup;//HashMap<String,HashMap<TrrigerKey,TriggerWrapper>>,,key为TrrigerKey.group protected TreeSet timeTriggers;//TreeSet<TrrigerWrapper> 红黑树 protected HashMap calendarsByName; protected ArrayList triggers; //List<TriggerWrapper> protected final Object lock = new Object(); protected HashSet pausedTriggerGroups; protected HashSet pausedJobGroups; protected HashSet blockedJobs; protected long misfireThreshold; protected SchedulerSignaler signaler; private final Logger log = LoggerFactory.getLogger(getClass()); private static final AtomicLong ftrCtr = new AtomicLong(System.currentTimeMillis()); }
//TriggerKey,JobKey包装类
class TriggerWrapper { TriggerWrapper(OperableTrigger trigger) { state = 0; if(trigger == null) { throw new IllegalArgumentException("Trigger cannot be null!"); } else { this.trigger = trigger; key = trigger.getKey(); jobKey = trigger.getJobKey(); return; } } public boolean equals(Object obj) { if(obj instanceof TriggerWrapper) { TriggerWrapper tw = (TriggerWrapper)obj; if(tw.key.equals(key)) return true; } return false; } public int hashCode() { return key.hashCode(); } public OperableTrigger getTrigger() { return trigger; } public final TriggerKey key; public final JobKey jobKey; public final OperableTrigger trigger; public int state; public static final int STATE_WAITING = 0;//等待 public static final int STATE_ACQUIRED = 1;//就绪 public static final int STATE_EXECUTING = 2;//执行 public static final int STATE_COMPLETE = 3;//完成 public static final int STATE_PAUSED = 4;//暂停 public static final int STATE_BLOCKED = 5;//阻塞 public static final int STATE_PAUSED_BLOCKED = 6;//暂停阻塞 public static final int STATE_ERROR = 7;//错误 }
总结:
调度器暂停和恢复trriger,是通过改变triggersByKey中TriggerWrapper的TrrgerKey为trrigerKey的状态,暂定和恢复job是通过暂停和恢复triggers容器中JobKey为jobKey的TriggerWrapper。
发表评论
-
TreeSet在Quartz任务调度过程中的作用
2017-08-24 23:43 682红黑树详解:http://www.cnblogs.com/sk ... -
Quartz使用与Spring集成系列教程
2016-10-26 09:48 458Quartz的使用:http://donald-draper. ... -
Spring与Quartz集成-源码分析
2016-09-13 11:50 2637在阅读以下文章之前,如果对Quartz任务调度不是很熟悉,请看 ... -
Spring与Quartz集成详解
2016-09-09 17:52 2763首先这个所有的依赖包就不需要多讲了,首先下载Quazrt发布包 ... -
Quartz 任务存储JobStoreTX 持久化之RDB-源码分析
2016-09-08 18:24 2220Quartz 任务存储JobStoreTX 持久化之RDB:h ... -
Quartz 任务存储JobStoreTX 持久化之RDB
2016-09-08 11:52 2711Quartz储存方式之JDBC JobStoreTX:http ... -
Quartz任务调度源码分析
2016-09-07 13:12 3511Quartz的使用:http://donald-draper. ... -
Quartz的job调度源码分析
2016-09-06 13:03 8Quartz的使用:http://donald ... -
Quartzs的job,trriger监听器源码分析
2016-09-06 11:15 1439Quartz的使用:http://donald-draper. ... -
Quartz的Scheduler初始化源码分析
2016-09-05 16:14 3511Quartz的使用:http://donald ... -
Quartzs的job存储,触发器、job删除源码分析
2016-09-05 15:39 4424前言:unscheduleJob针对TriggerKey,而d ... -
Quartz的使用
2016-09-05 11:39 1744Quartz使用总结:http://www.cnblogs.c ...
相关推荐
quartz集群调度机制调研及源码分析,基于quartz 1.7版本
quartz 触发器表达式生成器 准确的生成触发器生成器
最近项目在用quartz去定时执行一些方法,这些时间都是动态的,而且还要去动态的去修改这些触发的时间,但是网上资料不全,这里写了个案例希望可以帮到大家,包呢得靠大家自己下载了,我这里用的包是quartz官网上下载...
Spring Quartz 动态暂停、恢复、修改定时任务的一个demo,使用maven构建,框架采用spring springmvc jpa,数据库mysql,含数据库脚本,运行可用,页面访问地址http://localhost:8080/quartz_demo/quartz/list
实现把job持久化数据库,里面有具体的说明文档 Quartz 1 1 通过quartz创建持久化定时...1.3.1 实现org.quartz.Job接口 6 1.3.2 把以上job持久化到数据库中 6 1.4 启动job所需条件 6 1.4.1 在web.xml中加入如下监听 6
NULL 博文链接:https://hyj0903.iteye.com/blog/978153
Quartz触发器的使用DEMO(Spring实现)
Quartz 在开源任务调度框架中的翘首,它提供了强大任务调度机制,难能可贵的是它同时保持了使用的简单性。Quartz 允许开发人员灵活地定义触发器的调度时间表,并可以对触发器和任务进行关联映射。
自己写的Quartz+Sping定时触发器例子,包含全部jar包,可直接运行。注释完整,适合初学者学习。
quartz触发器表达式生成器,根据这个工具自动生成表达式,粘贴即可使用
Quartz Job Scheduling Framework 中文版 V1.0.0.rar。
Quartz Job Scheduling Framework.chm
Quartz Job Scheduling Framework 中文版 十分感谢原作者
Quartz Job Scheduling Framework 中文版 chm版
把本人博客上零零散散,顺序错乱的各篇译章汇集成册,做成了一个 《Quartz Job Scheduling Framework 中文版.chm 》文件与各位分享,以方便大家的阅读。另外,每篇译章都有到达我的博客上所对应页面的链接,所以有...
以此篇权当译者序。再次翻看一下我的博客,最早的那篇《 Quartz ...于是就到网上找来 Quartz 相关的资料,介绍使用倒也不含糊,但缺乏系统与深度,继而找 到的就是这本英文版的《 Quartz Job Scheduling Framework 》。
Quartz Job Scheduling Framework 中文版 V0.9.5 API帮助文档
Quartz 批量下载源码,Quartz 批量下载源码Quartz 批量下载源码Quartz 批量下载源码Quartz 批量下载源码Quartz 批量下载源码Quartz 批量下载源码Quartz 批量下载源码Quartz 批量下载源码Quartz 批量下载源码
Quartz 是一个完全由java编写的开源作业调度框架,本文档是Quartz 的接口帮助文档,涵盖了Quartz 使用中所需要的接口。
本人译作,在先前那个 Quartz Job Scheduling Framework_V1.0.0.CHM 文件的基础上做成的 PDF 文件,方便大家阅读。