关于Quartz,我想不要多做介绍了,凡是接触JAVA调度的都会知道这个开源的调度框架.本文就重点说下Quartz中有状态JOB的使用心得.因为我感觉国内的有状态JOB相关的资料比较少,所以在此提供一部分个人的一点经验.主要是针对使用quartz1.6的有状态JOB可能出现的一个棘手问题.
1.关于有状态JOB(StatefulJob)
网上有很多关于有状态JOB的作用与使用的文章,我借鉴下,做下简单的说明:
a). 实现有状态JOB只需要实现org.quartz.StatefulJob 接口即可,StatefulJob 接口仅仅是扩展了 Job 接口,未加入新的方法.
b). Job(无状态)和 StatefulJob 在框架中使用中存在两个关键差异。首先,JobDataMap 在每次执行之后重新持久化到 JobStore 中。这样就确保你对 Job 数据的改变直到下次执行仍然保持着。你可以在有状态 Job 中简单的通过 map 的 put() 方法来修改 JobDataMap.已存在的任何数据会被新的数据覆盖掉。你也能对无状态的 Job 这么做,但是因为对于无状态 Job 来说,JobDataMap 不会持久化,所以数据不会保存下来。
c). 两个或多个有状态的 JobDetail 实例不能并发执行。说的是你创建并注册了一个有状态 JobDetail 到 Scheduler 上。你还建立了两个 Trigger 来触发这个 Job:一个每五分钟触发,另一个也是每五分钏触发。假如这两个 Trigger 试图在同一时刻触发 Job,框架是不允许这种事情发生的。第二个 Trigger 一直会被阻塞直到第一个结束。
2.使用有状态JOB可能碰到的棘手问题(我目前所碰到的)
在使用quartz1.6版本的时候,我碰到过比较麻烦的问题,后来在iteye和csdn求助都没有解决.还是从国外的文章上找到了一些眉目解决了.
在实现SteafulJob接口后,该JOB怎么搞都只执行一次.
public class SimpleJob implements StatefulJob {
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("begin execute...");
System.out.println("end execute...");
}
}
public static void main(String [] args) {
try{
Scheduler scher = StdSchedulerFactory.getDefaultScheduler(); Calendar cal = Calendar.getInstace();
cal.add(Calendar.SECOND,1);
Trigger trigger = new SimpleTrigger("JD","JD",cal.getTime (),null,5,3000L);
JobDetail jobDetail = new JobDetail("JD","JD",SimpleJob.class);
scher.scheduleJob(jobDetaill,trigger);
scher.start();
}catch(Exception ex){
ex.printStackTrade();
}
}
后来发现,每次调度启动执行一次后,quartz的记录触发器状态的表就会显示该触发器的状态为:ERROR.
于是从这上面下功夫,还是久久不能解决,然后求助网络.后来尝试了2个方案,终于解决了.
方案一: 国内网站的一个解决方案,说是2个或多个项目使用同一个quartz数据源,会产生冲突出现上述问题,突然想起公司的quartz数据源好像是有2-3个项目连着.结果修改了其他2个项目的quartz数据源,只让我正在弄的项目连接quartz数据源,一样没能解决,只能作罢.估计我出现的问题和这位总结者的问题不一样.
方案二:这是从国外网站看到的一个方案,属于换血型的改动,风险也还是有的.就是进行版本迁移.Quartz1.6及以下版本存在着一些不稳定的状况,具体什么状况我没验证过.但是我是实在不知道怎么下手了,就尝试着将Quartz换成方案中所说的稳定性很不错的版本:2.0版本.然后进行测试,问题就解决了.
Quartz2.0版本作为目前quartz最稳定的版本,还是值得使用的.不过中间的API变动相当大.我列出一些不同的地方.
a). 实现方式
2.0之前的版本是直接实现StatefulJob接口.
2.0版本:使用注解方式
@PersistJobDataAfterExecution
@DisallowConcurrentExecution
public class StatefulJobAction implements Job{ }
b). 对象操作
JobDetail jobDetail = null;
JobDataMap dataMap = null;
CronTrigger cronTrigger = null;
String calendarName = triggerName;
DailyCalendar dailCalendar = new DailyCalendar(startTime,endTime);
dailyCalendar.setInvertTimeRange(true);
scheduler.addCalendar(calendarName,dailyCalendar,null,null);
/** quartz1.6 */
/**
jobDetail = new JobDetail(jobName,jobGroup,StatefulJobAction.class);
dataMap = new JobDataMap();
dataMap.put("Scher",scher);
jobDetail.setJobDataMap(dataMap);
cronTrigger = new CronTrigger(triggerName,triggerGroup); cronTrigger.setStartTime(startTime);
cronTrigger.setEndTime(endTime);
cronTrigger.setCalendarName(calendarName);
*/
/** quartz2.0 */
jobDetail = newJob(StatefulJobAction.class).withIdentity(jobName,jobGroup).build();
dataMap = jobDetail.getJobDataMap();
dataMap.put("Scher",scher);
//一次性构建触发器
/**
cronTrigger = newTrigger().withIdentity(triggerName,triggerGroup).withSchedule(cronSchedule(cronExpress)).startAt(startTime).endAt(endTime).modifiedByCalendar(triggerName).build;
*/
//分开构建触发器
TriggerBuilder<Trigger> triggerBuilder = newTrigger(); triggerBuilder.withIdentity(triggerName,triggerGroup);
if(StringUtils.isBlank(startTime)){
triggerBuilder.startAt(new Date());
} else{
triggerBuilder.startAt(startTime);
}
triggerBuilder.endAt(endTime);
cronTrigger = triggerBuilder.withSchedule(cronSchedule(cronExpress)).modifiedByCalendar(triggerName).build();
//简单触发器 //
SimpleTrigger simpleTrigger = newTrigger().withSchedule(simpleSchedule()).withIntervalInSeconds(10).withRepeatCount(5).build();
另外有一点需要注意,可以看到quartz2.0版本有很多这种写法:newTrigger(),simpleScheduler().其实是采用了JDK1.5后提供的静态导入.
import static org.quartz.CronScheduleBuilder.cronSchedule;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule; import static org.quartz.TriggerBuilder.newTrigger;
import static静态导入是JDK1.5中的新特性。静态导入是导入这个类里的静态方法。然后就可以直接用方法名调用静态方法,而不必用ClassName.方法名 的方式来调用。
这种方法的好处就是可以简化一些操作,例如打印操作System.out.println(...);就可以将其写入一个静态方法print(...),在使用时直接print(...)就可以了。
最后在附件里附上quartz2.0需要的jar包,和quartz2.0的docs即sql脚本.
必须的JAR包:
quartz-2.0.jar,
slf4j-api.1.6.2.jar
slf4j-log4j12-1.6.2.jar
c3p0-0.9.1.jar
分享到:
相关推荐
Quartz 1.6API方便查阅,很好的资料。
Quartz1.6API参考手册.chm Quartz是java中的一个定时程序库。这是chm格式的API参考手册。
### quartz有状态Job和无状态Job详解 #### 一、概述 在Quartz调度器中,根据Job是否能够保持状态,可以将其分为两类:有状态Job(Stateful Job)和无状态Job( Stateless Job)。这两种类型的Job在实现上有所不同,并且...
Quartz1.5,Quartz1.6,Quartz1.8。Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个...
Quartz 1.6 是一个开源的作业调度...总之,Quartz 1.6 在 WebAPP 下的应用,结合 Tomcat 服务器,为 Java Web 开发者提供了一个强大且灵活的定时任务解决方案。通过正确配置和编程,可以轻松地实现各种定时业务逻辑。
在版本1.6中,Quartz提供了稳定的性能和丰富的功能。这个压缩包包含的资源可以帮助我们深入理解Quartz的工作机制,包括源码、API文档以及示例。 1. **源码**:Quartz 1.6的源码可以让我们洞察其内部实现。通过阅读...
Quartz是开源的,具有高度灵活的调度功能,能够根据预定义的时间表触发任务,同时具备调度状态的持久化能力,即使在系统故障后也能恢复调度。 Spring对Quartz进行了集成,使其更易于在Spring应用程序中使用。Spring...
Quartz 1.6.5 使用手册概述 Quartz 是一个功能强大且灵活的开源作业调度框架,广泛应用于各种企业级应用程序中。以下是 Quartz 1.6.5 使用手册的概述和相关知识点总结。 环境准备 在开始使用 Quartz 之前,需要...
在Java定时任务领域,Spring Quartz 提供了高度灵活且可靠的解决方案。本篇将深入探讨Spring与Quartz的集成,以及如何利用它们实现Java定时任务调度。 首先,Quartz是一个完全实现了JDBC作业存储的开源作业调度框架...
赠送jar包:quartz-1.6.1.jar 赠送原API文档:quartz-1.6.1-javadoc.jar 包含翻译后的API文档:quartz-1.6.1-javadoc-API文档-中文(简体)-英语-对照版.zip 对应Maven信息:groupId:org.opensymphony.quartz,...
Quartz还支持JobDetail,允许你对Job进行更详细的配置,如Job的名称、组名和可持久化状态。 3. **Trigger**: Trigger定义了Job的执行时机。Quartz提供了多种Trigger类型,如SimpleTrigger(一次性执行或按固定间隔...
Quartz是Java领域的一款...通过阅读和分析Quartz 1.6.0源码,开发者不仅可以深入理解其工作原理,还能为自己的项目设计出更高效、更稳定的定时任务解决方案。同时,这也是一种提升编程技巧和理解分布式系统的好方式。
5. 调试Job:在Job的`execute`方法中设置断点,通过IDE的调试工具观察执行流程,检查变量状态,定位问题。 6. 调试Trigger:如果触发机制有问题,可以通过修改Trigger的配置或者查看Scheduler的日志来排查问题。 在...
11_Elastic-Job框架介绍.mp4 12_初识Elastic-Job.mp4 13_急速入门Simple-1.mp4 14_急速入门Simple-2.mp4 15_急速入门dataflow.mp4 16_急速入门script.mp4 17_知识点检测与小结.mp4 18_Simple作业的3种整合方式介绍....
实现把job持久化数据库,里面有具体的说明文档 Quartz 1 1 通过quartz创建持久化定时执行任务 3 1.1 首先创建一个基本的web工程,所需jar包 3 1.2 Quartz配置文件quartz.properties 4 1.3 创建job 6 1.3.1 实现org....
最近公司项目上线,需要把app部署在多台服务器上,但只能让其中一台服务器的job执行,一台服务器挂了,另一台还能继续执行job,通过网上查找资料,都是java工程的方式,不好部署并测试,经过二天辛苦整合,终于整理成...
Quartz和IIS是两种在IT领域中广泛使用的工具,它们分别用于任务调度和Web服务管理。这篇内容将深入探讨这两个概念以及如何解决IIS闲置时间的问题。...在实际应用中,应根据具体需求和环境选择最适合的解决方案。
这个框架的设计目标是提供一个简单且可扩展的解决方案,用于在分布式环境中调度作业。Quartz的核心概念包括Job(作业)、Trigger(触发器)以及Scheduler(调度器)。 1. **Job(作业)**: 在Quartz中,Job是你要...
让我们深入探讨一下这个"spring2.0+quartz1.6定时器"的工作原理和实现细节。 首先,Spring框架是一个广泛应用的开源Java框架,它提供了依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented ...