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配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"/>
</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();
6、scheduler.getCurrentlyExecutingJobs():获取的不是打开状态的任务,而是正在执行的任务。比如我五秒钟打一行字符串,如果我在程序打字符串的时候正好执行scheduler.getCurrentlyExecutingJobs(),那么就可以得到。但是程序打字符串的时间是极短的,所以基本得不到。
7、定时任务启停:scheduler.isShutdown()将关闭定时任务的线程和相关资源 无法再次重启,所以如果要停止所有定时任务不要使用这个方法,可以使用standby或者遍历所有任务进行unscheduleJob(TriggerKey triggerKey),开启使用start(),系统启动后 默认是standby模式 需要start()一下才能开启所有任务;
系统启动后定时任务框架启动概述信息:
Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. --Scheduler排程类 以及加载是否成功
NOT STARTED. --当前是否开启
Currently in standby mode. --默认启动模式
Number of jobs executed: 0 --目前执行过的定时任务数目
Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.--默认启动十个线程支持
Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.--使用RAMJobStore不支持持久化
参考:
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 Boot+Quartz实现一个实时管理的定时任务
转载 https://www.cnblogs.com/wujiwen/p/9615120.html 项目实践过程中碰到一个动态管理定时任务的需求:针对每个人员进行信息的定时更新,具体更新时间可随时调整 ...
- Spring+quartz整合问题
今天一开始在弄quartz的时候用的2.0.2的jar包整合Spring3.0.5的时候报错 Java.lang.IncompatibleClassChangeError: class org.spr ...
- Hibernate + Spring (quartz) 整合懒(延迟)加载问题
开发项目的时候 在一个Job中执行了数据库操作, 用的是懒加载,但是如下错误 org.hibernate.LazyInitializationException: failed to lazily i ...
- Spring boot整合shiro权限管理
Apache Shiro功能框架: Shiro聚焦与应用程序安全领域的四大基石:认证.授权.会话管理和保密. #,认证,也叫作登录,用于验证用户是不是他自己所说的那个人: #,授权,也就是访问控制,比 ...
- spring quartz整合实现定时器自动注解
1.web.xml中添加侦听器 <listener> <listener-class>org.springframework.web.context.ContextLoa ...
- Spring 3整合Quartz 2实现定时任务--转
常规整合 http://www.meiriyouke.net/?p=82 最近工作中需要用到定时任务的功能,虽然Spring3也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够强大.在考虑之 ...
- Spring Boot整合Quartz实现定时任务表配置
最近有个小项目要做,spring mvc下的task设置一直不太灵活,因此在Spring Boot上想做到灵活的管理定时任务.需求就是,当项目启动的时候,如果有定时任务则加载进来,生成schedule ...
- java定时任务以及Spring使用Quartz调度器执行定时任务
java下的java.util.Timer中类可以实现定时执行任务的执行: 如:让任务立即执行,每隔1s循环执行一次 public class TimerClass { public static v ...
- spring boot 整合 quartz 集群环境 实现 动态定时任务配置【原】
最近做了一个spring boot 整合 quartz 实现 动态定时任务配置,在集群环境下运行的 任务.能够对定时任务,动态的进行增删改查,界面效果图如下: 1. 在项目中引入jar 2. 将需要 ...
随机推荐
- 10个提供免费PHP脚本下载的网站
本文将重点介绍10个PHP脚本的免费资源下载站.之前推荐 <16个下载超酷脚本的热门网站>,这些网站除了PHP脚本,还有JavaScript.Java.Perl.ASP等脚本.如果你已是脚 ...
- Tomcat原理 分类: 原理 2015-06-28 19:26 5人阅读 评论(0) 收藏
Tomcat的模块结构设计的相当好,而且其Web 容器的性能相当出色.JBoss直接就使用了Tomcat的web容器,WebLogic的早期版本也是使用了Tomcat的代码. Web容器的工作过程在下 ...
- struts2中token防止重复提交表单
struts2中token防止重复提交表单 >>>>>>>>>>>>>>>>>>>&g ...
- Collection_Other
package com.bjsxt.others.que; import java.util.ArrayDeque; import java.util.Queue; /** * 使用队列模拟银行存款业 ...
- 海量WEB日志分析
Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, Zookeeper, Avro, Ambari, ...
- 启动PL/SQL Developer 报字符编码不一致错误 Database character set (AL32UTF8) and Client character set (ZHS16GBK) are different. Character set conversion may cause unexpected results. Note: you can set the client
今天写hibernate时候遇到一些异常 代码: 出现异常情况: 出现以上原因是Session关闭 如果不是使用的SessionFactory.getSession()来获得Session. 而是使用 ...
- HighChart图片本地导出
Highchart第三方图表控件,导出默认是从官方地址导出,这样在无外网的条件下则导致导出失败,改进如下: 后台导出代码: public partial class HighChart : Syste ...
- UVa 11859 (Nim) Division Game
把每一行m个数所有的素因子看做一堆,就把问题转化为n堆的Nim游戏. 然后预处理一下10000以内每个数素因数的个数,再根据书上的Bouton定理,计算一下n行素因数个数的异或和. 为0是先手必败局面 ...
- Android development tools line_endings hacking
/******************************************************************** * Android development tools li ...
- 【C#学习笔记】退出程序
1.this.Close(); 只是关闭当前窗口,若不是主窗体的话,是无法退出程序的,另外若有托管线程(非主线程),也无法干净地退出: 2.Application.Exit(); 强制所有消息中 ...