Quartz配置简介

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;
public class DumbJob implements Job {
       
       
private int x;
       
public void 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

 
 

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(
new Date()));  // 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”。
下面是一个最简单的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(
new Date()));  // 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”。

评论联播

Your email address will not be published. Required fields are marked *