Quartz 项目应用笔记.docx
- 文档编号:9027133
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:16
- 大小:22.02KB
Quartz 项目应用笔记.docx
《Quartz 项目应用笔记.docx》由会员分享,可在线阅读,更多相关《Quartz 项目应用笔记.docx(16页珍藏版)》请在冰豆网上搜索。
Quartz项目应用笔记
Quartz项目应用笔记
Quartz是一个强大的企业级Schedule工具,也是目前最好的开源Schedule工具,最近因为项目的需要,简单的用到了Quartz的一些功能,对项目中使用Quartz的一些问题做简单的记录。
在Quartz的应用中,我们用到了以下的一些东西,ScheduleFactory,Scheduler,Job,JobDetail,Trigger,简单说明一下他们的用途。
SchedulerFactory是Scheduler的工厂,我们可以从中获得受工厂管理的Scheduler对象。
SchedulerFactoryscheduleFactory=newStdSchedulerFactory();
Schedulerscheduler=scheduleFactory.getScheduler();
Scheduler是一个计划集,其中可以包含多个JobDetail和Trigger组成的计划任务。
我们可以从SchedulerFactory中取得Scheduler。
接口Job是每个业务上需要执行的任务需要实现的接口,该接口只有一个方法:
publicinterfaceJob{
publicvoidexecute(JobExecutionContextcontext)
throwsJobExecutionException;
}
我们可以在里面定义我们的Job执行逻辑,比如清除过期数据,更新缓存等。
JobDetail描述了一个任务具体的信息,比如名称,组名等等。
JobDetailjobDetail=newJobDetail("SayHelloWorldJob",Scheduler.DEFAULT_GROUP,SayHelloWorldJob.class);
在上面的构造方法中,第一个是任务的名称,第二个是组名,第三个就是实际当任务需要执行的回调类。
Trigger顾名思义就是触发器,Quartz有个很好的想法就是分离了任务和任务执行的条件。
Trigger就是控制任务执行条件的类,当Trigger认为执行条件满足的时刻,Trigger会通知相关的Job去执行。
分离的好处是:
1.你可以为某个Job关联多个Trigger,其中任何一个条件满足都可以触发job执行,这样可以完成一些组合的高级触发条件
2.当Trigger失效后(比如:
一个永远都不能满足的条件),你不必去声明一个新的job,代替的是你可以为job关联一个新的Trigger让job可以继续执行。
目前的Quartz实现中,存在两种Trigger,SimpleTrigger和CronTrigger,SimpleTrigger用来完成一些比如固定时间执行的任务,比如:
从现在开始1分钟后等等;而CronTrigger(没错,和unix的cron进程的含意一样)用来执行calendar-like的任务,比如:
每周五下午3:
00,每月最后一天等等。
在我们项目中,都是一些固定时间的Job,所以只用到了SimpleTrigger。
Triggertrigger=newSimpleTrigger("SayHelloWorldJobTrigger",Scheduler.DEFAULT_GROUP,newDate(),null,0,0L);
这个构造方法中,第一个是Trigger的名称,第二个是Trigger的组名,第三个是任务开始时间,第四个是结束时间,第五个是重复次数(使用SimpleTrigger.REPEAT_INDEFINITELY常量表示无限次),最后一个是重复周期(单位是毫秒),那么这样就创建了一个立刻并只执行一次的任务。
但我们定义好了JobDetail,Job,和Trigger后,就可以开始Schedule一个Job了。
scheduler.scheduleJob(jobDetail,trigger);
这条语句就是把job和Trigger关联,这样当Trigger认为应该触发的时候就会调用(实际上是Scheduler调用)job.execute方法了。
scheduler.start();
千万别忘了加上上面的语句,这条语句通知Quartz使安排的计划生效。
关于execute方法的参数JobExecutionContext
JobExecutionContext就和很多Context结尾的类功能一样,提供的运行时刻的上下文环境,JobExecutionContext中有Scheduler,JobDetail,Trigger等很多对象的引用,从而当你在execute方法内部须需要这些对象的时刻提供的便利。
在项目中,我们把需要执行的Job相对应的一些信息放在JobExecutionContext中,在Job执行的时候可以调用。
jobDetail.getJobDataMap().put(userid,id);
在Job中,我们可以拿到相关的Context信息:
jobExecutionContext.getJobDetail().getJobDataMap().getInt(userid);
JobDetail和Trigger的name和group
Scheduler实例对应了很多job和trigger的实例,为了方便的区分,Quartz使用name和group这两个特性,正如你想向的一样,同一个group下不能有两个相同name的JobDetail,Trigger同理,同一个Scheduler下不能有两个相同group的JobDetail,Trigger同理,JobDetail和Trigger的完全限定名为:
group+name
为了让服务器重启以后,我们的Scheduler信息仍然不丢失,我们通常采用数据库持久化Scheduler的信息。
DBScript在Quartz的下载包中的:
quartz-1.6.0\docs\dbTables下,选择自己使用的DB相应的Script导入数据库就可以了。
在应用中,我们需要配置一个quartz.properties才能正常使用DB。
我们可以在quartz-1.6.0\examples\example10中找到该文件的样例,稍作一些修改,就可以放到自己项目源码的根目录下使用了。
设置org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX即可启用基于JDBC的Quartz信息持久化。
根据项目情况设置以下配置信息:
org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.useProperties=false
org.quartz.jobStore.dataSource=myDS
org.quartz.jobStore.tablePrefix=QRTZ_
org.quartz.jobStore.isClustered=false
org.quartz.dataSource.myDS.driver=com.mysql.jdbc.Driver
org.quartz.dataSource.myDS.URL=jdbc:
mysql:
//localhost:
3306/myapplication
org.quartz.dataSource.myDS.user=root
org.quartz.dataSource.myDS.password=
org.quartz.dataSource.myDS.maxConnections=5
但是光设置了Database不够,我们还需要在Application启动的时候自动启动Scheduler才行,我们只需要简单的写一个Servlet的Listener并在web.xml中声明该Listener,在Servlet容易启动的时候,Scheduler就开始自动执行。
publicclassScheduleStartListenerimplementsServletContextListener{
publicvoidcontextInitialized(ServletContextEventservletContextEvent){
try{
scheduleFactory.getScheduler().start();
}catch(SchedulerExceptione){
//writelog
}
}
publicvoidcontextDestroyed(ServletContextEventservletContextEvent){
try{
scheduleFactory.getScheduler().shutdown();
}catch(SchedulerExceptione){
//writelog
}
}
}
在web.xml里面加入以下配置:
以上简单的记录了在项目中关于Quartz的一些应用,如果有什么新的使用心得,会在后面继续加入的。
对quartz的总结
关键字:
Springspringquartz学习心得
Quartz是一个强大的企业级Schedule工具,也是目前最好的开源Schedule工具。
Spring中也集成了quartz的应用,下面就讲一下如何在spring中使用quartz。
spring的配置:
xml代码
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
Job:
org.quartz.Job是一个接口,只定义了voidexecute(JobExecutionContextcontext)throwsJobExecutionException;一个方法。
当定时任务被触发后,系统会自动调用实现了该接口的方法。
在spring中,org.springframework.scheduling.quartz.QuartzJobBean对其进行了封装,使用了TemplateMethod模式。
主要是为了在使用jobDataMap时更加方便。
QuartzJobBean有两个方法,
publicfinalvoidexecute(JobExecutionContextcontext)throwsJobExecutionException
Job接口中定义的,spring在该方法里进行了些处理,将jobDataMap中的值注入到该Job的实现者中
protectedabstractvoidexecuteInternal(JobExecutionContextcontext)throwsJobExecutionException
这是一个抽象方法,用户在扩展了QuartzJobBean后,要自己实现该方法,在其中添加相应的业务逻辑
JobDetail:
JobDetail描述了一个任务具体的信息。
在Spring中,JobDetailBean对JobDetail进行了封装(继承了JobDetail)。
privateStringname;//名称
privateStringgroup=Scheduler.DEFAULT_GROUP;//组
privateStringdescription;//描述
privateClassjobClass;//定时任务触发时,回调的class,该class要实现Job接口或继承QuartzJobBean
privateJobDataMapjobDataMap;//该任务存储的数据,在回调的时候也可以使用
privatebooleanvolatility=false;//是否持久化到org.quartz.spi.JobStore中
privatebooleandurability=false;//当该任务完成后,是否还在JobStore中继续保留该任务
privatebooleanshouldRecover=false;//当系统重新启动后,是否再次执行该任务
对于jobDataMap,它是是一个封装过的Map,使用方法同Map,如
jobDetailBean.getJobDataMap().put(target,value);
如果使用了QuartzJobBean,在使用jobDetailBean时,可将target的值设成QuartzJobBean的子类的属性名称,这样,在定时触发时,spring会自动将与target对应的value值注入到QuartzJobBean的子类中去。
如。
java代码
1....
2.publicclassReminderManagerextendsQuartzJobBean{
3.privateStringreminderStr="";
4.}
5....
6.jobDetailBean.getJobDataMap().put(reminderStr,"abcdefg");
7....
这样当该任务被触发后,在ReminderManager中,reminderStr的值就会被注入为"abcdefg"。
Trigger:
trigger就是触发器。
Quartz有个很好的想法就是分离了任务和任务执行的条件。
Trigger就是控制任务执行条件的类,当Trigger认为执行条件满足的时刻,Trigger会通知相关的Job去执行。
分离的好处是:
1.你可以为某个Job关联多个Trigger,其中任何一个条件满足都可以触发job执行,这样可以完成一些组合的高级触发条件
2.当Trigger失效后(比如:
一个永远都不能满足的条件),你不必去声明一个新的job,代替的是你可以为job关联一个新的Trigger让job可以继续执行。
目前的Quartz实现中,存在两种Trigger,SimpleTrigger和CronTrigger,在spring中分别用SimpleTriggerBean和CronTriggerBean对其进行封装。
SimpleTrigger是简单触发器,如从某日到某日,每个一定时间进行一次提醒,在这段时间内进行多少次提醒;CronTrigger是复杂触发器,用来执行calendar-like的任务,可设定一些复杂的触发规则,如每年的x月的第y个星期五,或是每个星期天的几点进行提醒。
后面附加一个日常语义与cronTrigger的转化
Trigger
privateStringname;//名称
privateStringgroup=Scheduler.DEFAULT_GROUP;//组
privateStringjobName;//所关联的jobDetail的名称
privateStringjobGroup=Scheduler.DEFAULT_GROUP;//所关联的jobDetail的组
privateStringdescription;//描述
privateJobDataMapjobDataMap;//该触发器存储的数据,在回调的时候也可以使用
privatebooleanvolatility=false;//是否持久化到org.quartz.spi.JobStore中
SimpleTrigger
privateDatestartTime=null;//开始日期
privateDateendTime=null;//结束日期
privateDatenextFireTime=null;//下次的触发时间
privateDatepreviousFireTime=null;//上次的触发时间
privateintrepeatCount=0;//重复次数
privatelongrepeatInterval=0;//重复间隔
privateinttimesTriggered=0;/已触发的次数
SimpleTriggerBean
privateJobDetailjobDetail;//所关联的JobDetail,方便在配置文件中使用
CornTrigger
privateCronExpressioncronEx=null;//触发条件表达式,它有一个String型的setter
privateDatestartTime=null;//开始日期
privateDateendTime=null;//结束日期
privateDatenextFireTime=null;//下次的触发时间
privateDatepreviousFireTime=null;//上次的触发时间
privatetransientTimeZonetimeZone=null;//所在时区
CronTriggerBean
privateJobDetailjobDetail;//所关联的JobDetail,方便在配置文件中使用
Scheduler的常用方法
添加一个定时任务:
DatescheduleJob(JobDetailjobDetail,Triggertrigger)
修改一个定时任务,主要是更改trigger:
DaterescheduleJob(StringtriggerName,StringgroupName,TriggernewTrigger)
删除一个定时任务,同时也会将于该jobDetail关联的trigger一并删除:
booleandeleteJob(StringjobName,StringjobGroup)
取得所有的jobDetail组
String[]getJobGroupNames()
取得某个group下的所有的jobDetail
String[]getJobNames(StringgroupName)
取得指定的jobDetail
JobDetailgetJobDetail(StringjobName,StringjobGroup)
取得指定的jobDetail的所有的Trigger
Trigger[]getTriggersOfJob(StringjobName,StringgroupName)
取得指定的Trigger
TriggergetTrigger(StringtriggerName,StringtriggerGroup)
Quartz的存储:
Quartz默认的是使用RAM存储所有的信息,但是这样的话,当我们重启服务器后,之前的所有的定时任务就全消失了。
为了让服务器重启以后,我们的定时任务仍不丢失,我们可采用数据库持久化定时任务。
首先要先建立数据库,在quartz-1.6.0\docs\dbTables下,选择自己使用的数据库的sql脚本,建立相应的数据库表。
在WEB-INF下加一个quartz.properties。
我们可以在quartz-1.6.0\examples\example10中找到该文件的样例
org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX#表明使用JDBC进行持久化
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.useProperties=false
org.quartz.jobStore.dataSource=myDS
org.quartz.jobStore.tablePrefix=QRTZ_#该值尽量不要改动,如改动,还要相应的修改sql脚本
org.quartz.jobStore.isClustered=false
org.quartz.dataSource.myDS.driver=net.sourceforge.jtds.jdbc.Driver
org
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Quartz 项目应用笔记 项目 应用 笔记