首页 > 代码库 > Spring 3整合Quartz 2实现手动设置定时任务:新增,修改,删除,暂停和恢复----每一个你不满意的当下,都有一个你不曾努力的过去

Spring 3整合Quartz 2实现手动设置定时任务:新增,修改,删除,暂停和恢复----每一个你不满意的当下,都有一个你不曾努力的过去

 

摘要:在项目的管理功能中,对定时任务的管理有时会很常见。但一般定时任务配置都在xml中完成,包括cronExpression表达式,十分的方便。但是如果我的任务信息是保存在数据库的,想要动态的初始化,还有就是任务较多的时候不是得有一大堆的xml配置?或者说我要修改一下trigger的表达式,使原来5秒运行一次的任务变成10秒运行一次,或者说我要控制定时任务的 “ 暂停 ” 呢?暂停之后又要在某个时间点 “ 重启 ” 该定时任务呢?或者说直接 “ 删除 ” 该定时任务呢?要 改变某定时任务的触发时间呢?这时问题就来了,试过在配置文件中不传入cronExpression等参数,但是启动时就报错了,难道我每次都修改xml文件然后重启应用吗,这显然不合适的。

最理想的是在与spring整合的同时又能实现动态任务的添加、删除及修改配置,而且不需要重启应用。

 首先我们来回顾一下spring中使用quartz的配置代码:

<!-- 使用MethodInvokingJobDetailFactoryBean,任务类可以不实现Job接口,通过targetMethod指定调用方法--><bean id="taskJob" class="com.tyyd.dw.task.DataConversionTask"/><bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">    <property name="group" value="http://www.mamicode.com/job_work"/>    <property name="name" value="http://www.mamicode.com/job_work_name"/>    <!--false表示等上一个任务执行完后再开启新的任务-->    <property name="concurrent" value="http://www.mamicode.com/false"/>    <property name="targetObject">        <ref bean="taskJob"/>    </property>    <property name="targetMethod">        <value>execute</value>    </property></bean><!--  调度触发器 --><bean id="myTrigger"      class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">    <property name="name" value="http://www.mamicode.com/work_default_name"/>    <property name="group" value="http://www.mamicode.com/work_default"/>    <property name="jobDetail">        <ref bean="jobDetail" />    </property>    <property name="cronExpression">        <value>0/5 * * * * ?</value>    </property></bean><!-- 调度工厂 --><bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">    <property name="triggers">        <list>            <ref bean="myTrigger"/>        </list>    </property></bean>

所有的配置都在xml中完成,包括cronExpression表达式,十分的方便。但是如果定时任务一多并且需要手动变化时,就得有一大堆的xml配置,不方便管理。

于是在设计时我想到以下几点

1、减少spring的配置文件。

2、用户可以通过页面等方式添加、启用、禁用某个任务。

3、用户可以修改某个已经在运行任务的运行时间表达式,即CronExpression。

4、为方便维护,简化任务的运行调用处理,任务的运行入口即Job实现类最好只有一个,该Job运行类相当于工厂类,在实际调用时把任务的相关信息通过参数方式传入,由该工厂类根据任务信息来具体执行需要的操作。

就像如下图所示:

1、可在页面直接查看任务详情

技术分享

 

2、可添加、修改

技术分享

3、可立即执行,并查看执行详情

技术分享

 

在上面的思路下来进行我们的开发吧。

一、初始化用的数据库脚本

SET FOREIGN_KEY_CHECKS=0;-- ------------------------------ Table structure for task_detail-- ----------------------------DROP TABLE IF EXISTS `task_detail`;CREATE TABLE `task_detail` (  `job_id` int(100) NOT NULL AUTO_INCREMENT,  `job_name` varchar(200) DEFAULT NULL COMMENT ‘任务名称‘,  `job_group` varchar(100) DEFAULT NULL COMMENT ‘任务分组‘,  `job_status` varchar(5) DEFAULT NULL COMMENT ‘任务状态 0禁用 1启用 2删除‘,  `cron_expression` varchar(200) DEFAULT NULL COMMENT ‘任务运行时间表达式‘,  `bean_class` varchar(300) DEFAULT NULL COMMENT ‘任务执行类‘,  `execute_method` varchar(100) DEFAULT NULL COMMENT ‘任务执行方法‘,  `create_time` date DEFAULT NULL COMMENT ‘任务创建时间‘,  `update_time` date DEFAULT NULL COMMENT ‘任务更新时间‘,  `job_desc` varchar(500) DEFAULT NULL COMMENT ‘任务描述‘,  PRIMARY KEY (`job_id`)) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;-- ------------------------------ Records of task_detail-- ----------------------------INSERT INTO `task_detail` VALUES (‘9‘, ‘测试手动设置任务‘, ‘testQuartzTask‘, null, ‘0 0 1 * * ?‘, ‘com.zealer.cps.task.executor.TestQuartzTask‘, ‘printOneWord‘, ‘2017-06-22‘, ‘2017-06-22‘, ‘打印一句话‘);

 然后创建对应的实体类ScheduleJob.java

技术分享 View Code

二、spring配置文件spring.xml

<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" />

然后在web.xml加入

<context-param>    <param-name>contextConfigLocation</param-name>    <param-value>classpath:spring.xml</param-value></context-param>

三、编写任务控制器TaskController.java

技术分享 View Code

四、编写任务运行入口,即JobMethod.java

技术分享 View Code

 五、编写业务层类QuartzJobService.java

技术分享 View Code

六、编写sql映射xml文件QuartzJob.xml

技术分享 View Code

七、修改和列表页面

updateJob.jsp

技术分享 View Code

taskList.jsp

技术分享 View Code

 到这里,我们的spring3 整合quartz 2的定时任务功能终于是告一段落了,对常用的一些功能进行了实现,相信可以满足一般项目的需求了。

Spring 3整合Quartz 2实现手动设置定时任务:新增,修改,删除,暂停和恢复----每一个你不满意的当下,都有一个你不曾努力的过去