Quartz框架简介
⼀、Quartz概述:
Quartz是⼀个完全由编写的开源任务调度的框架,通过触发器设置作业定时运⾏规则,控制作业的运⾏时间。其中quartz集通过故障切换和负载平衡的功能,能给调度器带来⾼可⽤性和伸缩性。主要⽤来执⾏定时任务,如:定时发送信息、定时⽣成报表等等。
⼆、相关术语:
三、Quartz的体系结构简介:
Quartz框架主要核⼼组件包括调度器、触发器、作业。调度器作为作业的总指挥,触发器作为作业的操作者,作业为应⽤的功能模块。其关系如下图所⽰:
Job为作业的接⼝,为任务调度的对象;JobDetail⽤来描述Job的实现类及其它相关的静态信息;Trigger做为作业的定时管理⼯具,⼀个Trigger只能对应⼀个作业实例,⽽⼀个作业实例可对应多个触发器;Scheduler做为定时任务容器,是quartz最上层的东西,它提携了所有触发器和作业,使它们协调⼯作,每个Scheduler都存有JobDetail和Trigger的注册,⼀个Scheduler中可以注册多个JobDetail和多个Trigger。
1、Job
Job是⼀个接⼝,只有⼀个⽅法void execute(JobExecutionContext context),被调度的作业(类)需实现该接⼝中execute()⽅
法,JobExecutionContext类提供了调度上下⽂的各种信息。每次执⾏该Job均重新创建⼀个Job实例,如:
[java]
1. public class DDNJob implements Job{
2.
3. public void execute(JobExecutionContext arg0) throws JobExecutionException {
4. perform();
5. }
6.
7. public void perform(){ //执⾏报表统计⼊⼝函数
8. //业务逻辑
9. System.out.println("⾃动DDN预授权开始执⾏-------------执⾏时间:"+new Date());
10. }
11. }
注:DDNJob类为需要定时执⾏的类,execute为定时执⾏的⽅法。⼀个定时任务对应⼀个Job实现类。
2、JobDetail
Quartz在每次执⾏Job时,都重新创建⼀个Job实例,所以它不直接接受⼀个Job的实例,相反它接收⼀个Job实现类,以便运⾏时通过newInstance()的反射机制实例化Job。因此需要通过⼀个类来描述Job的实现类及其它相关的静态信息,如Job名字、描述、关联等信息,JobDetail承担了这⼀⾓⾊。JobDetail ⽤来保存我们作业的详细信息。⼀个JobDetail可以有多个Trigger,但是⼀个Trigger只能对应⼀个JobDetail,
⽰例:
[java]
1. 1. JobDetail jobDetail = new JobDetail("myJob","myGroup",DDNJob.class)
2. 2. 说明:
3. 3. myJob:job 名
4. 4. myGroup:job 组(为'null'时,使⽤缺省的组sched.DEFAULT_GROUP)
5. 5. DDNJob.class:要被执⾏的Java类。
运⽤spring集成的MethodInvokingJobDetailFactoryBean时spring能⾃动⽣成符合quartz要去的JobDetail。
Spring中l配置如下:
[html]
1. <!-- detail任务描述 -->
2. <bean name="DDNDetail"
3. class="com.mangocity.mpmmon.autoDDN.MethodInvokingJobDetailFactoryBean">
4. <property name="targetObject" value="DDNJob" />
5. <property name="concurrent" value="false"/>(并发执⾏)
6. <property name="shouldRecover" value="true"/>
7. </bean>
3、Trigger
spring framework组件Trigger是⼀个类,描述触发Job执⾏的时间触发规则。主要有SimpleTrigger和 CronTrigger这两个⼦类。当仅需触发⼀次或者以固定时间间隔周期执⾏,SimpleTrigger是最适合的选择;⽽CronTrigger则可以通过Cron表达式定义出各种复杂时间规则的调度⽅案:如每早晨9:00执⾏,周⼀、周三、周五下午5:00执⾏等;Spring中l配置如下:
SimpleTrigger使⽤⽰例:
[html]
1. // Initiate SimpleTrigger with its name and group name
2. SimpleTrigger simpleTrigger = new SimpleTrigger("simpleTrigger","triggerGroup1");
3. // set its start up time
4. simpleTrigger.setStartTime(new Date(System.currentTimeMillis()));
5. // set the interval, how often the job should run (10 seconds here)
6. simpleTrigger.setRepeatInterval(10000);
7. // set the number of execution of this job, set to 10 times.
8. simpleTrigger.setRepeatCount(10);
通过Spring配置,jobDetail为配置的Job描述,startDelay为系统启动执⾏延迟时间,repeatCount为调⽤次数,repeatInterval为Job触发时间间隔。
[html]
1. <bean id="DDNSimpletrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
2. <property name="jobDetail" ref="DDNDetail"/>
3. <property name="startDelay" value="1"/>
4. <property name="repeatCount" value="100"/>
5. <property name="repeatInterval" value="1000"/>
6. </bean>
CronTrigger使⽤⽰例:
[java]
1. // Initiate CronTrigger with its name and group name
2. CronTrigger cronTrigger = new CronTrigger("cronTrigger","triggerGroup2");
3. try {
4. // setup CronExpression
5. CronExpression cexp = new CronExpression("0/5 * * * * ?");
6. // Assign the CronExpression to CronTrigger
7. cronTrigger.setCronExpression(cexp);
8. } catch (Exception e) {
9. e.printStackTrace();
10. }
通过Spring配置,jobDetail为配置的Job描述,cronExpression为Job的运⾏规则,具体见附录部分内容。
[html]
1. <bean id="DDNCrontrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
2. <property name="jobDetail" ref="DDNDetail"/>
3. <property name="cronExpression" value="0/5 * * ? * * *"/>
4. </bean>
4、Scheduler
Scheduler负责管理Quartz的运⾏环境,Quartz它是基于多线程架构的,它启动的时候会初始化⼀套线程,这套线程会⽤来执⾏⼀些预置的作业。Trigger和JobDetail可以注册到Scheduler中;Scheduler可以将Trigger绑定到某⼀JobDetail中,这样当Trigger触发时,对应的Job就被执⾏。 Scheduler拥有⼀个SchedulerContext,它类似于ServletContext,保存着Scheduler上下⽂信息,Job和Trigger都可以访问SchedulerContext内的信息。Scheduler使⽤⼀个线程池作为任务运⾏的基础设施,任务通过共享线程池中的线程提⾼运⾏效率。应⽤⽰例:
[java]
1. SchedulerFactory schedulerFactory = new StdSchedulerFactory();
2. // Retrieve a scheduler from schedule factory
3. Scheduler scheduler = Scheduler();
4. …
5. // schedule a job with JobDetail and Trigger
6. scheduler.scheduleJob(jobDetail, simpleTrigger);
7. // start the scheduler
8. scheduler.start();
Spring中l配置:
[html]
1. <!-- 调度器 -->
2. <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
3. <property name="dataSource">
4. <ref bean="dataSource"/>
5. </property>
6. <property name="triggers">
7. <list>
8. <!-- 触发器列表 -->
9. <!-- <ref bean="DDNcronTrigger" /> -->
10. <ref bean="DDNSimpletrigger" />
11. </list>
12. </property>
13. <property name="configLocation" value="classpath:quartz.properties" />
14. </bean>
其中,dataSource为数据源配置,triggers为触发器列表配置,可以同时包含多个trigger,configLocation为quartz配置⽂件
quartz.properties加载路径。
四、总结:
我们不只有⼀种两种⽅法来实现我们的定时任务,就我知道的出了我们的quartz框架之外,我们也⾃⼰封装有⾃⼰的定时器,再加上各种开源的插件。那我⼯作的公司来说,我们⽤windows服务来完成这个定时任务,万变不离其宗,理解了他们的原理以及精髓,我们就可以去创新,去写出符合⾃⼰要求的⼯具了!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论