Quartz配置简介 (转)

来源:互联网 发布:imac装windows系统 编辑:程序博客网 时间:2024/06/05 10:17
 

Quartz配置简介

最近项目中用到了Quartz,在网上看到这篇文章,转过来跟大家分享。

原网址:http://beastiedog.blog.163.com/blog/static/23984625200642255527207/

Quartz是一个开源的作业调度框架,它完全由Java写成,并设计用于J2SEJ2EE应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。本系统结合通过Spring来集成Quartz

Quartz官方网址:http://www.opensymphony.com/quartz

 

基本概念:

1.      JobJobQuartz中的一个接口,顾名思义,它指定了我们需要执行的任务。下面是一个简单的Job实现:

java代码


package quartz;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

publicclass DumbJobimplements Job {
       
       
privateint x;

       
publicvoid execute(JobExecutionContext context)throws JobExecutionException {
               
try {
                       
System.out.println("Executing..." + x);
                }
catch (RuntimeException e) {
                        JobExecutionException e2 =
new JobExecutionException(e);
                       
System.out.println(context.getRefireCount());
                        throw e2;
                }
        }

}

 

需要注意的是Job实现类必须有一个无参数的构造函数,我们也从来不需要自己去实例化一个JobQuartz负责具体的Job调度与执行。

2.      JobDetailJobDetail是一个具体的类,它用于描述Job,示例如下:

JobDetail jobDetail =new JobDetail("myJob", "myGroup", DumbJob.class);

上面初始化了一个名字为“myJob”的JobDetail,它在“myGroup”组中。注意,这里并没有Job的实例出现,我们只需要传入Jobclass(这里是DumbJob.class)。

3.      Trigger:触发器,它用于定义Job何时执行。最常用的是SimpleTriggerCronTrigger。一般来说,如果你需要在一个固定的时间和重复次数或者一个固定的间隔时间,那么SimpleTrigger比较合适;如果你有许多复杂的作业调度,那么CronTrigger比较合适。 CronTriggerUnixcron机制基本一样,我们需要的只是一个cron表达式。比如“0 0 12 * * ?”会在每天中午12点触发Job执行;“0 15 10 ? * 6L”会在每个月的最后一个星期五的早上10:15触发Job执行。

4.      SchedulerSchedulerFactoryScheduler负责管理Trigger、调度JobSchedulerFactory则是Scheduler工厂,负责生成Scheduler

 

下面是一个最简单的Quartz调用:

 

java代码

SchedulerFactory schedFact =new org.quartz.impl.StdSchedulerFactory();
Scheduler sched = schedFact.getScheduler();
sched.start();

JobDetail jobDetail =
new JobDetail("myJob",null, DumbJob.class);
Trigger trigger = TriggerUtils.makeHourlyTrigger();
// fire every hour
trigger.setStartTime(TriggerUtils.getEvenHourDate(
newDate())); // start on the next even hour
trigger.setName("myTrigger");

sched.scheduleJob(jobDetail, trigger);

 

 

使用Spring集成Quartz

本系统使用Spring来集成Quartz。我们只需要在Spring中配置相应的TriggerJob,而不需要编写任何Java代码,Spring在找到这些bean后会自动启动这些Job。下面是CLS系统中的部分配置:

 

Spring配置

       <bean id="dumbJob"class="org.springframework.scheduling.quartz.JobDetailBean">
                <property name="group " value="dumb "/>
                <property name="jobClass " value="example.DumbJob "/>
                <property name="name" value="dumbJob "/>
        </bean>

 

        <bean id="settlementJob"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
                <property name="targetObject" ref="settlementBizFacade"/>
                <property name="targetMethod" value="doSettlement"/>
                <property name="concurrent" value="
false"/>
                <property name="name" value="settlement"/>
        </bean>
       
        <bean id="settlementTrigger"
class="org.springframework.scheduling.quartz.CronTriggerBean">
                <property name="jobDetail" ref="settlementJob"/>
                <!-- run at 23:55 everyday -->
                <property name="cronExpression" value="0 55 23 * * ?"/>
        </bean>
       
        <bean
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
                <property name="triggers">
                        <list>
                                <ref bean="settlementTrigger"/>
                        </list>
                </property>
                <property name="quartzProperties">
                        <map>
                                <!-- 1 job thread, change this
if more jobs added -->
                                <entry key="org.quartz.threadPool.threadCount" value="1"/>
                        </map>
                </property>
        </bean>

 

 

首先我们需要配置一个Job,这里有两种方式:一种是为Job创建一个独立的JobClass,然后使用SpringJobDetailBean配置该Job;另一种是使用MethodInvokingJobDetailFactoryBean指定一个方法,不需要一个单独的JobClass,它需要设置“targetObject”和“targetMethod”,则Trigger触发该Job的时候,目标方法会被调用。这里把“concurrent”设置为“false”,这被调用的方法不会在新线程里运行,而是顺序执行。

 

接下来我们配置了一个名为“settlementTrigger”的Cron触发器,它定义了settlementJob合适被调用。

 

最后需要配置的是SchedulerFactoryBean,它负责调度所有的trigger,还可以配置Quartz。因为当前的任务间隔较远,没有频繁执行的要求,所以这里把Quartz的线程数设为“1”。

原创粉丝点击