开源调度框架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. 让ImageView可以使用gif的方法

    在自己的包中添加MyGifView.java(直接复制,粘贴),读取gif资源在MyGifView中第20行读取: MyGifView.java: package com.zzw.testgifuse ...

  2. 通过xsd生成xml类

    步骤二:使用VS2010 Tools中的命令提示窗口 如下图所示 执行结果:生成myschema.xsd对应的C#类文件. 命令剖析: /c  生成对应的类文件 /l:cs 类文件使用C#语言 /ou ...

  3. 小课堂Week9 例外处理设计的逆袭Part2

    小课堂Week9 例外处理设计的逆袭Part2 今天继续阅读<例外处理设计的逆袭>这本书,我们先看两个案例: 案例1 问:如果要设计一个依据学号到数据库中查询学生资料的函数,当找不到符合条 ...

  4. sublimetext2 中运行Python提示EOFError: EOF when reading a line

    解决方法:一.安装sublimeREPL    打开sublimeText2按CTRL+SHIFT+P,英文版输入:install后选择Package Control: Install Package ...

  5. 表达式语言之ongl表达式

    OGNL的全称是Object Graph Navigation Language(对象图导航语言),它是一种强大的表达式语言,让你通过简单一致的表达式语法来读取和设置Java对象的属性值,调用对象的方 ...

  6. OBIEE 11g:Error:nQSError 36010 Server version 318 cannot read the newer version of the repository

    biee11g升级到最新版以后,发现了一些bug,需要回退到原来的版本,卸载掉升级包以后,启动BI服务,会报上述错误.这是因为资料库文件已经升级为了最新版本.这时候我们需要将资料库文件进行降版本操作. ...

  7. 4-2.矩阵乘法的Strassen算法详解

    题目描述 请编程实现矩阵乘法,并考虑当矩阵规模较大时的优化方法. 思路分析 根据wikipedia上的介绍:两个矩阵的乘法仅当第一个矩阵B的列数和另一个矩阵A的行数相等时才能定义.如A是m×n矩阵和B ...

  8. 阿里云服务器上安装mysql的心路历程(博友们进来看看哦)

    在阿里云花了100买了一台云服务器,配置如下: CPU: 1核 内存: 512MB 数据盘: 0G 带宽: 1Mbps 阿里云服务器安装mysql搞得我想吐血,搞了一个多星期,现在才搞好,而且,还有许 ...

  9. linux-CentOS6.4下安装oracle11g详解

    参考地址:http://dengqsintyt.iteye.com/blog/1991930

  10. CentOS-6.5安装配置JDK-7和JDK-8

    安装说明 系统环境:centos-6.5 软件:jdk-7-linux-x64.rpm , jdk-8u5-linux-i586.tar.gz  下载地址:http://www.oracle.com/ ...