开源调度框架Quartz最佳实践
Quartz是一个Java调度框架,当前的最新版本为2.2.1。
以Quartz 2.2.1版为例,Quartz最佳实践(用于生产系统)总结如下:
1、跳过更新检查
Quartz内置了一个“更新检查”特性,因此Quartz项目每次启动后都会检查官网,Quartz是否存在新版本。这个检查是异步的,不影响Quartz项目本身的启动和初始化。
可以在Quartz配置文件中,设置org.quartz.scheduler.skipUpdateCheck的属性为true来跳过更新检查。
2、JobDataMap技巧
在JobDataMap应该只存储原始的数据类型(包括字符串),这样可以避免数据序列化的问题以及长期运行的问题。
3、使用合并后的JobDataMap
官方推荐,Job.execute()方法通常应该从JobExecutionContext发现的JobDataMap中取回数据,而不是直接从JobDetail中取数据。
4、使用TriggerUtils
TriggerUtils工具类作用如下:
1)提供了一种更简单的创建触发器的方式;
2)提供了带调度器创建触发器的各种方法来满足特殊需求,与直接初始化特殊类型的触发器(SimpleTrigger、CronTrigger),然后调用各种setter方法进行配置相反。
3)提供了更为简单的创建日期时间的方法;
4)提供了辅助类来分析触发器(比如计算未来的激活次数等)。
5、一定不要直接写数据到Quartz表
通过SQL语句写调度数据到数据库表,而不应该使用调度API来写数据,因为:
1)会导致数据冲突(删除数据、争夺的数据)。
2)会导致当触发器的激活时间到了时,Job会看起来不见了。
3)会导致当触发器的激活时间到了时,Job会不执行,看起来“仅仅坐在那儿”。
4)可能会导致死锁
5)还可能导致其他奇怪的问题和数据崩溃等
6、一定不要把多个非集群的调度器实例指向同一个数据库表
如果把多个调度器实例指向同一个数据库表,而且这些调度器实例没有做集群配置,那么可能会发生:
1)会导致数据冲突(删除数据、争夺的数据)。
2)会导致当触发器的激活时间到了时,Job会看起来不见了。
3)会导致当触发器的激活时间到了时,Job会不执行,看起来“仅仅坐在那儿”。
4)可能会导致死锁
5)还可能导致其他奇怪的问题和数据崩溃等
7、确保适合的数据源连接数
官方推荐数据源的最大连接数应该配置为线程池的最小工作线程数的3倍。如果你还需要额外的连接(比如频繁地调用调度器API),如果还使用了JobStoreCMT,那么非托管的数据源的最大连接数应该是至少4倍以上。
8、避免调度Job的时间安排在夏令时转换的交界处
SimpleTrigger触发器不受此影响。
9、等待条件
如果连接池所有的线程都处于繁忙状态,那么长期运行的Job会阻止其他Job的运行。
如果在工作线程执行Job时调用Thread.sleep()后,Job余下的工作有可能得不到执行,因为会等待一些条件(比如数据记录有效后)为真后再执行。
最佳的解决方案是释放工作线程(退出Job),允许其他Job在线程上得到执行。Job可以重新调度自身,或者等其他Job在退出前调度它。
10、Job抛出异常
Job执行方法应该包含try-catch代码块,以处理各种可能发生的异常。
如果Job抛出异常,Quartz通常会立即重新执行(看起来会再次抛出同样的异常)。最佳的方式是让Job能够捕获它可能会遇到的所有异常,处理这些异常,然后再重调度Job。
11、可恢复性和幂等性
标记为“可恢复的”、在进行中的Job在调度器失效后是可以自动重新执行的。这意味着同样的Job工作可能会执行两次。
12、在监听器中保持代码简洁高效
不鼓励监听器内执行大量的工作,执行Job或完成触发器并激活另一个Job等,都应该绑定到监听器。
13、监听器抛出异常
每个监听器(TriggerListener、JobListener和SchedulerListener)应该包含try-catch代码块,以处理各种可能发生的异常。
如果监听器抛出异常,它或许会导致其他监听器得不到通知或阻止Job的执行等等。
14、注意安全
一些开发者会通过应用程序的用户接口暴露Quartz调度器的功能,这很有用,但也很危险。因为恶意用户可以通过这种方式控制或破坏您的系统。
开源调度框架Quartz最佳实践的更多相关文章
- 分布式开源调度框架TBSchedule原理与应用
主要内容: 第一部分 TBSchedule基本概念及原理 1. 概念介绍 2. 工作原理 3. 源代码分析 4. 与其它开源调度框架对照 第二部分 TBSchedule分布式调度演示样例 1. TBS ...
- 通过源码分析Java开源任务调度框架Quartz的主要流程
通过源码分析Java开源任务调度框架Quartz的主要流程 从使用效果.调用链路跟踪.E-R图.循环调度逻辑几个方面分析Quartz. github项目地址: https://github.com/t ...
- atitit. 统计功能框架的最佳实践(1)---- on hibernate criteria
atitit. 统计功能框架的最佳实践(1)---- on hibernate criteria 1. 关键字 1 2. 统计功能框架普通有有些条件选项...一个日期选项..一个日期类型(日,周,月份 ...
- Quartz最佳实践
本文来自对http://www.quartz-scheduler.org/documentation/best-practices.html的翻译. 表示还没用过Quartz,正准备用的,然后在官网上 ...
- 快速web开发中的前后端框架选型最佳实践
这个最佳实践是我目前人在做的一个站点,主要功能: oauth登录 发布文章(我称为"片段"),片段可以自定义一些和内容有关的指标,如“文中人物:12”.支持自定义排版.插图.建立相 ...
- .NET开源作业调度框架(Quartz.NET和FluentScheduler)实战项目演练
一.课程介绍 明人不说暗话,跟着阿笨一起玩NET .本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享 ...
- .Net平台开源作业调度框架Quartz.Net
Quartz.NET介绍: Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中. ...
- (转).Net平台开源作业调度框架Quartz.Net
Quartz.NET介绍: Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中. ...
- 开源定时任务框架Quartz(一)
简介 Quartz是OpenSymphony开源组织的一个开源项目,定时任务框架,纯Java语言实现,最新版本为2.3.0. 设计模式 Quartz中使用的设计模式如下: 1.Builder模式 2. ...
随机推荐
- eclipse,myeclipse svn 和jadclipse 反编译插件 及安装
插件下载链接:http://download.csdn.net/download/mmyzlinyingjie/6456785 myeclipse svn 安装: 把svn解压,然后把这个文件夹放在m ...
- 【面试虐菜】—— LVS负载均衡
Load Balancer(负载均衡器): Load Balancer是整个集群系统的前端,负责把客户请求转发到Real Server上.Load Balancer通过Ldirectord监测各Rea ...
- WPF:简洁为美
(1)3行代码实现水印TextBox(Watermark TextBox) 效果图: 源代码: <Grid> <Grid.Resources> <BooleanToVi ...
- hdu 2256 Problem of Precision 构造整数 + 矩阵快速幂
http://acm.hdu.edu.cn/showproblem.php?pid=2256 题意:给定 n 求解 ? 思路: , 令 , 那么 , 得: 得转移矩阵: 但是上面求出来的并 ...
- Linux 挂载存储方法
申请的虚拟机因总宕机,处理完之后多分配了我100G空间,还是狠讲究的嘛,挂载方法如下: 初始磁盘挂载情况:[root@wmstest ~]# df -hFilesystem Size Used Ava ...
- python之函数式编程
python提供了支持函数式编程的简单机制: 1. map函数 2. filter函数 3. reduce函数. 典型的M/R计算模型. 但还是有点简单...
- ASP.NET MVC +EasyUI 权限设计(二)环境搭建
请注明转载地址:http://www.cnblogs.com/arhat 今天突然发现博客园出问题了,老魏使用了PC,手机,平板都访问博客园了,都是不能正常的访问,原因是不能加载CSS,也就是不能访问 ...
- NOIP2015-stone(二分答案)
这道题在考试时二分答案写炸了,结果得了20分.....同学有用贪心写的(对,贪心!!)都得了30,我感到了深深的恶意.这段时间在忙转语言,现在重新整理一下NOIP的题. 题目来源:vijos 题目如下 ...
- 时序图 Sequence Diagram
时序图(Sequence Diagram)是显示对象之间交互的图,这些对象是按时间顺序排列的. 时序图中显示的是参与交互的对象及其对象之间消息交互的顺序. 下面这张图介绍了时序图的基本内容: 下面这张 ...
- ubuntu 14.04链接无线路由,建立无线和有线链接
神奇的linux. 废话不多说,进入主题: 首先1:买一部带wifi的笔记本电脑,买一个可用的无线路由器,像网络提供商申请上网缴费==! 2,中国国情,我们大多都是用ADSL咯.所以其它情况就不说了. ...