在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 * * * ?
重启应用,我们的计划任务已经可以正常执行了。