Spring+Quartz 整合二:调度管理与定时任务分离

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring+Quartz 整合二:调度管理与定时任务分离相关的知识,希望对你有一定的参考价值。

  新的应用场景:很多时候,我们常常会遇到需要动态的添加或修改任务,而spring中所提供的定时任务组件却只能够通过修改xml中trigger的配置才能控制定时任务的时间以及任务的启用或停止,这在带给我们方便的同时也失去了动态配置任务的灵活性。所有的配置都在xml中完成,包括cronExpression表达式,十分的方便。但是如果我的任务信息是保存在数据库的,想要动态的初始化,而且任务较多的时候不是得有一大堆的xml配置?或者说我要修改一下trigger的表达式,使原来5秒运行一次的任务变成10秒运行一次,这时问题就来了,试过在配置文件中不传入cronExpression等参数,但是启动时就报错了,难道我每次都修改xml文件然后重启应用吗,这显然不合适的。最理想的是在与spring整合的同时又能实现动态任务的添加、删除及修改配置。

场景要求:
1、减少spring的配置文件,为了实现一个定时任务,spring的配置代码太多了。
2、用户可以通过页面等方式添加、启用、禁用某个任务。
3、用户可以修改某个已经在运行任务的运行时间表达式,CronExpression。
4、为方便维护,简化任务的运行调用处理,任务的运行入口即Job实现类最好只有一个,该Job运行类相当于工厂类,在实际调用时把任务的相关信息通过参数方式传入,由该工厂类根据任务信息来具体执行需要的操作。

分析:配置文件的模式是将配置中中job、trigger等取出来排程,采用数据库存储也是一样的 取出来组装排程

步骤:
步骤一:spring配置文件

1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
5 
6     <bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"/>
7 </beans>

步骤二:创建任务,将任务存入数据库,对人物进行启动、删除、暂停、恢复、立即运行一次处理

注意:任务的处理不仅仅是任务 还有触发器 等  而且有些操作有先后限制  比如删除,要先暂停触发器  后移除触发器 然后移除任务等

技术分享

 步骤三:创建定时任务:两种创建方式:实现Job接口或者继承QuartzJobBean抽象类。名字和实体bean里的jobname一致。

public class QuartzJob extends QuartzJobBean{}

public class QuartzJob implements Job {} 

 

注意:
1、trigger各状态说明:
None:Trigger已经完成,且不会在执行,或者找不到该触发器,或者Trigger已经被删除 NORMAL:正常状态 PAUSED:暂停状态 COMPLETE:触发器完成,但是任务可能还正在执行中 BLOCKED:线程阻塞状态 ERROR:出现错误
2、更新任务 直接更新不起作用,要先删除后新创建;
3、同步和异步:同步和异步在quartz 2.2的版本中对于使用者来说区别只在于是否在job类上添加了@DisallowConcurrentExecution注解,需要注意在定时任务运行时更新是没有办法改变同步和异步的
4、集群、分布式架构实现探讨:使用消息机制,通过分发和接收信息来实现对集群中定时任务的管理。

5、执行多次的问题:triger在定义时有一个默认的参数startTime,如果不设置的话会默认设置为now
CronTrigger trigger = newTrigger().withIdentity("trigger1", "group1").startNow().withSchedule(cronSchedule("0/2 * * * * ?")).build();

参考:
http://www.dexcoder.com/selfly/article/308
http://www.dexcoder.com/selfly/article/1822?curPage=83#comment
http://blog.csdn.net/pengpegv5yaya/article/details/37595889

 

以上是关于Spring+Quartz 整合二:调度管理与定时任务分离的主要内容,如果未能解决你的问题,请参考以下文章

Spring与Quartz的整合实现定时任务调度[转]

Spring Boot 整合Quartz定时器

话编程 | Spring整合Quartz分布式调度

Spring Boot 应用系列 6 -- Spring Boot 2 整合Quartz

项目一:第十四天 1.在realm中动态授权 2.Shiro整合ehcache 缓存realm中授权信息 3.动态展示菜单数据 4.Quartz定时任务调度框架—Spring整合javamail发送

Quartz 任务调度框架整合Spring使用