使用Quartz定时器在Java中执行计划任务

在JavaEE系统中,计划任务的执行是一项很普通的工作,需要我们定时执行一些维护和例行的任务。比如定时统计,发送邮件,报表,甚至通知和提醒等。

计划任务的实现有多种方式。比如使用数据库的定时任务(Jobs和Events),服务器的计划任务(Windows的计划作任务,Linux的Crontab系统。

那么Java本身能否实现定时任务呢,当然是可以的,我们可以使用Java.util.Timer 和 Java.util.TimerTask来完成这项工作,但是这种方法在调用上其实是不方便,需要大量的代码。解决这个问题的通行方法是使用Quartz框架。它是一个基于Java的计划任务框架,在定时执行上,可以使用Linxu的CronExperssion,便于使用和维护。

添加Quartz的依赖

如果你使用的是Maven,那么只需要简单的在pom.xml文件中增加下面的依赖就可以了。

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>1.8.4</version>
</dependency>

编写业务类

计划任务的执行必须有业务逻辑的类,这里可以一个比较简单的POJO类。我们定义如下:

public class ExpireJobTask {

    private static final Logger logger = LoggerFactory.getLogger(ExpireJobTask.class);

    public void doBiz() {

  // 执行业务逻辑

  // ........
    }

}

这个类比较简单,就只有一个方法。我们推荐业务类足够简单,你可以把业务逻辑放在其它类中,但是就完成任务调来说,这个类应该尽量简单

增加Spring 配置

由于Spring中已经预先设置了对应的接口,因此,我们只需要很简单的配置就可以启用了。 我们找到Spring的配置文件。增加下面的内容

   <bean id="bizObject" class="com.arcsoft.sdk.scheduler.ActiveCodeExpireNotifyJob"></bean>
    <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="bizObject"></property>
        <property name="targetMethod" value="execute"></property>
    </bean>
    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="jobDetail" />
        <!--每天10点30分执行此任务-->
         <property name="cronExpression" value="0 30 10 * * ?" />
    </bean>

    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="cronTrigger" />
            </list>
        </property>
    </bean>

在上面的代码中,我们注到cronExpression,这是一个用于设置重复执行时间的表达多。它的基本语法如下:

cronExpression = "0 10 0 * * ?"  // 秒 分 时 日 月 年 

每天0:10  =  0 10 0 * * ? 
每小时第10分钟 = 0 10 * * * ? 
每隔10分钟 = 0 0/10 * * * ? 

重启应用,我们的计划任务已经可以正常执行了。