-
2008-01-30
quartz介绍 - [工作学习]
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
quartz源代码的14个例子非常好,建议分析,执行一下。把log4j.xml拷贝到src/java即可。 CronTrigger也可以指定一个Job类。 0/15表示每15x执行一次 Scheduler.start()执行之后,任务才会被真正调度。 同一Job(fullName相同的job)的JobDataMap是共享的。(example4) round的job,如果上一个job还没有执行结束,就需要跳过。需要从JobDataMap中获取一个状态标志isRunning,运行结束设为Idle并存入JobDataMap中。这样的一个问题是必须多过一轮才能执行到。(这样是否可以容忍了?)参考example5的实现。 haha,仔细看完example5之后,原来没那么复杂,quartz已经做得很好了,只要将job实现StatefulJob接口即可,而不是原来的Job接口,哈哈。 job fullname的规范:group1.job1 trigger fullname的规则:group1.trigger1 groupname=Task类型 jobname=j+task类名+job启动时间 triggername=t+task类名+job启动时间 如果一个job执行过程中发生异常,那么我们是否可以控制这种异常了?答:可以。quartz提供对job.execute执行过程中发生异常的继续处理流程,可以通过JobExecutionException来进行控制,比如: JobExecutionException e2 = new JobExecutionException(e); e2.refireImmediately(); //重新执行一次 e2.setUnscheduleAllTriggers(true); //让所有触发器都取消调度 如果一个定时轮询的任务,运行了一段时间,你想终止正在调度的任务,但是又不取消这个任务(仅仅终止本次调度,不影响后续的调度),此时该怎么实现?难道要自己写代码检测吗?答:不用。quartz提供了完全解决方案,你可以通过实现InterruptableJob即可。参考example7. 如何实现一个每年,每月,每天的任务调度? 答:容易,quartz提供了一系列的Calendar来加入到Scheduler的调度日历中即可。 任务结束后,让和让他回调一个Listener?答:容易,quartz提供了JobListener,在Scheduler上建立Listener,然后将Listener与Job关联,即能实现事件回调。这样可以做很多任务的关联,比如Job1执行结束后,然后将Job2放入调度器中。参考example9. quartz的更高级特性:可持久化;当scheduler负载过大有些job可能没有被调度到,此时可以设置setRequestsRecovery来让其可以再被调度。能远程调度、EJB、和jboss等app server集成;支持cluster。基于优先级进行调度。 quartz与concurrent各自的优势:自己稍微看了一下,比较一下各自特点,不一定正确,哈哈。 quartz优势:对调度等封装得非常好,目前应用的非常广泛,成熟;但因为封装的缘故,你本身对内部的线程控制手段较少(不过可以通过listener做些处理,呵呵)。 concurrent优势:concurrent本身是jdk标准,jdk1.5才支持,支持丰富的并发处理能力,对调度要自己写很多的代码,不过concurrent本身也提供了对schedule的强大支持,而且对并发性能应该比quartz有优势,并支持Future等流行的线程通信方式。
http://jimsu.yourblog.org/logs/629508.html
收藏到:Del.icio.us





