开源调度框架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最佳实践的更多相关文章

  1. 分布式开源调度框架TBSchedule原理与应用

    主要内容: 第一部分 TBSchedule基本概念及原理 1. 概念介绍 2. 工作原理 3. 源代码分析 4. 与其它开源调度框架对照 第二部分 TBSchedule分布式调度演示样例 1. TBS ...

  2. 通过源码分析Java开源任务调度框架Quartz的主要流程

    通过源码分析Java开源任务调度框架Quartz的主要流程 从使用效果.调用链路跟踪.E-R图.循环调度逻辑几个方面分析Quartz. github项目地址: https://github.com/t ...

  3. atitit. 统计功能框架的最佳实践(1)---- on hibernate criteria

    atitit. 统计功能框架的最佳实践(1)---- on hibernate criteria 1. 关键字 1 2. 统计功能框架普通有有些条件选项...一个日期选项..一个日期类型(日,周,月份 ...

  4. Quartz最佳实践

    本文来自对http://www.quartz-scheduler.org/documentation/best-practices.html的翻译. 表示还没用过Quartz,正准备用的,然后在官网上 ...

  5. 快速web开发中的前后端框架选型最佳实践

    这个最佳实践是我目前人在做的一个站点,主要功能: oauth登录 发布文章(我称为"片段"),片段可以自定义一些和内容有关的指标,如“文中人物:12”.支持自定义排版.插图.建立相 ...

  6. .NET开源作业调度框架(Quartz.NET和FluentScheduler)实战项目演练

    一.课程介绍 明人不说暗话,跟着阿笨一起玩NET .本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享 ...

  7. .Net平台开源作业调度框架Quartz.Net

    Quartz.NET介绍: Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中. ...

  8. (转).Net平台开源作业调度框架Quartz.Net

    Quartz.NET介绍: Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中. ...

  9. 开源定时任务框架Quartz(一)

    简介 Quartz是OpenSymphony开源组织的一个开源项目,定时任务框架,纯Java语言实现,最新版本为2.3.0. 设计模式 Quartz中使用的设计模式如下: 1.Builder模式 2. ...

随机推荐

  1. z470 装黑苹果 10.92

    1.分两个区,一个是mac安装区,一个是镜像拷贝区. 2.把镜像压进去. 3.安装好系统. 4.把镜像区的 extent拷贝到安装好的系统盘里去. 5.安装驱动,网盘里有.还有系统也在网盘里. 6.声 ...

  2. C#中的委托与事件 笔记

    1.委托是类型安全的回调函数,是将方法作为方法参数.委托可以注册多个方法:委托就是一个  multicastdelegate类,可以通过=赋值,+=添加方法(对象方法与静态方法),内部使用Delega ...

  3. sql replace

    update dbo.EquipmentAttribute set AttributeName=replace(AttributeName,'    ','') where EquipmentID=8 ...

  4. 只是一个用EF写的一个简单的分页方法而已

    只是一个用EF写的一个简单的分页方法而已 慢慢的写吧.比如,第一步,先把所有数据查询出来吧. //第一步. public IQueryable<UserInfo> LoadPagesFor ...

  5. jquery 取值赋值

    <input type="text" id="range_complete" /> $('#range_complete').val();//取值 ...

  6. 来吧,给你的Winform列表控件画个妆

    前言 以前看别人的控件好看只有羡慕的份:以前觉得控件重绘是个很复杂的东西:以前知道MSDN很全面很专业却一直没有好好用起来: 作为初级程序猿,不能原地踏步,来吧,让我们一起把 TreeView 美化一 ...

  7. 如何使用Xcode6 调试UI,Reveal

    实际测试需要使用IOS8并且32-bit的设备:具体打开调试的方法有三种: 1.底部调试菜单中: 2,debug菜单中 3.debug navigator 中

  8. Windows Phone 8.1 与 Windows Phone 8.1 Silverlight区别

    以下讨论基于当前的WP8 APP, 一.Windows Phone 8 app:旧的WP8程序:不需要迁移: 二.Windows Phone 8.1 app新的使用Windows Runtime 的程 ...

  9. 使用maven多模块来构建系统时,spring初始化报错的问题

    最近在实验maven结构的maven工程时,碰到一个问题,springbean总是初始化失败: Related cause: org.springframework.beans.factory.Uns ...

  10. 有关javascript中的JSON.parse和JSON.stringify的使用一二

    有没有想过,当我们的大后台只是扮演一个数据库的角色,json在前后台的数据交换中扮演极其重要的角色时,作为依托node的前端开发,其实相当多的时间都是在处理数据,准确地说就是在处理逻辑和数据(这周实习 ...