摘要:在项目的管理功能中,对定时任务的管理有时会很常见。但一般定时任务配置都在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="job_work"/> <property name="name" value="job_work_name"/> <!--false表示等上一个任务执行完后再开启新的任务--> <property name="concurrent" value="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="work_default_name"/> <property name="group" value="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
二、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
四、编写任务运行入口,即JobMethod.java
五、编写业务层类QuartzJobService.java
六、编写sql映射xml文件QuartzJob.xml
七、修改和列表页面
updateJob.jsp
taskList.jsp
到这里,我们的spring3 整合quartz 2的定时任务功能终于是告一段落了,对常用的一些功能进行了实现,相信可以满足一般项目的需求了。