您的位置:首页 > 编程语言 > Java开发

任务调度quartz(一)quartz在spring中的集成

2015-12-23 21:52 507 查看
对于定时器想必大家都应该挺清楚,就像闹钟一样,在某个指定的时间点定时执行。在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的童鞋有所帮助!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: