对于定时器想必大家都应该挺清楚,就像闹钟一样,在某个指定的时间点定时执行。在Java中我们可以使用quartz来定时调度自己的任务,这个框架为我们提供很多比较方便的功能,能够很轻易对我们的任务进行启动、暂停以及运行周期的修改。
任务调度的意义还是挺大的,例如我们可以写一个调度平台来管理和监控自己写的任务,而在这些任务中我们可以写自己想要干的事,比如做个生日提醒啊,只要发现当前是谁的生日,就给自己发个短信或邮件。或者在项目中完成一些特定的数据处理等。这个笔者会在下一篇博客中讲到。
接下来,直入正题。
一、所依赖的jar包
一是会依赖spring相关的包,而是会依赖quartz的包,spring已经对quartz提供了支持。
<!-- quartz任务调度 -->
<dependency>
<groupId>fakepath</groupId>
<artifactId>quartz-all</artifactId>
<version>2.1.6</version>
</dependency>
<dependency>
<groupId>fakepath</groupId>
<artifactId>quartz-commonj</artifactId>
<version>2.1.6</version>
</dependency>
二、spring的中配置
首先准备两个测试任务类,如下
TestJob.java:
package org.qiyongkang.schedule.quartz.job;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/**
* ClassName:TestJob <br/>
* Function: TODO ADD FUNCTION. <br/>
* Reason: TODO ADD REASON. <br/>
* Date: 2015年12月18日 下午4:37:12 <br/>
* @author qiyongkang
* @version
* @since JDK 1.6
* @see
*/
public class TestJob {
private Logger logger = LogManager.getLogger(TestJob.class.getName());
public void execute() {
//获取当前时间
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
logger.info("当前时间:{}", sdf.format(date));
}
}
TestJob2.java:
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/**
* ClassName:TestJob2 <br/>
* Function: TODO ADD FUNCTION. <br/>
* Reason: TODO ADD REASON. <br/>
* Date: 2015年12月21日 下午7:52:27 <br/>
* @author qiyongkang
* @version
* @since JDK 1.6
* @see
*/
public class TestJob2 {
private Logger logger = LogManager.getLogger(TestJob2.class.getName());
public void execute() {
//获取当前时间
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
logger.info("当前时间:{}", sdf.format(date));
}
}
然后,再来看看在spring中的配置:
spring-timer.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- Scheduler的配置 -->
<bean name="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!-- <property name="triggers">
<list>
<ref bean="testTrigger"/>
<ref bean="testTrigger2"/>
</list>
</property> -->
<property name="autoStartup" value="false"/> <!-- 默认为true -->
</bean>
<!-- Trigger的配置,指定job执行的时间周期 -->
<bean id="testTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="testJobDetail"/>
<property name="cronExpression" value="*/5 * * * * ?"/><!-- 每隔5秒钟触发一次 -->
</bean>
<bean id="testTrigger2" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="testJobDetail2"/>
<property name="cronExpression" value="*/1 * * * * ?"/><!-- 每隔1秒钟触发一次 -->
</bean>
<!-- JobDetail的配置,指定job的执行类和执行方法 -->
<bean id="testJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="testJob"/>
<property name="targetMethod" value="execute"/>
<property name="concurrent" value="true"/>
<!-- 是否允许任务并发执行。当值为false时,表示必须等到前一个线程处理完毕后才再启一个新的线程 -->
</bean>
<bean id="testJobDetail2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="testJob2"/>
<property name="targetMethod" value="execute"/>
<property name="concurrent" value="true"/>
</bean>
<!-- 业务类的配置 -->
<bean id="testJob" class="org.qiyongkang.schedule.quartz.job.TestJob"/>
<bean id="testJob2" class="org.qiyongkang.schedule.quartz.job.TestJob2"/>
</beans>
这里,我们可以配置web容器启动后自动调度程序,也可以手动进行启动和暂停。
三、启动和暂停
这里,笔者简单的写了这个页面来控制这两个任务的启动和暂停,如下:
然后,再来看看springMVC中接受请求的代码:
/**
*
* operateTask:任务的启动或停止. <br/>
*
* @author qiyongkang
* @param taskName
* @param flag:0->启动,1->停止
* @return
* @since JDK 1.6
*/
@RequestMapping
@ResponseBody
public ExtJsObject operateTask(String triggerName, String jobDetailName, Integer flag) {
ExtJsObject extJsObject = null;
Scheduler scheduler = startQuertz.getScheduler();
//获取CronTrigger
CronTrigger cronTrigger = SpringUtil.getBean(triggerName);
//获取jobDetail
JobDetail jobDetail = SpringUtil.getBean(jobDetailName);
try {
if (flag == 0) {
//启动此任务
scheduler.scheduleJob(jobDetail, cronTrigger);
if (!scheduler.isStarted()) {
scheduler.start();
}
} else if (flag == 1) {
//停止此任务
scheduler.pauseTrigger(cronTrigger.getKey());
scheduler.unscheduleJob(cronTrigger.getKey());
scheduler.deleteJob(jobDetail.getKey());
}
} catch (SchedulerException e) {
e.printStackTrace();
log.error("触发器启动异常", e);
}
return extJsObject;
}
启动后,控制台的输出如下图:
点击暂停后,也可以停止此任务。
好了,就先简单的讲到这儿了,希望对想使用quartz的童鞋有所帮助!