开源调度框架Quartz最佳实践

简介: 开源调度框架Quartz最佳实践 Quartz是一个Java调度框架,当前的最新版本为2.2.1。 以Quartz 2.2.1版为例,Quartz最佳实践(用于生产系统)总结如下:1、跳过更新检查Quartz内置了一个“更新检查”特性,因此Quartz项目每次启动后都会检查官网,Quartz是否存在新版本。
开源调度框架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调度器的功能,这很有用,但也很危险。因为恶意用户可以通过这种方式控制或破坏您的系统。
目录
相关文章
|
Java Spring
spring集成Quartz时区问题造成任务晚执行八小时
spring集成Quartz时区问题造成任务晚执行八小时
649 0
|
小程序 JavaScript API
uniapp微信小程序获取用户手机号
uniapp微信小程序获取用户手机号
771 0
|
Web App开发 运维 安全
SSL/TLS证书1年有效期新规已至,被“证书过期”支配的恐惧又增加了!
9月1日起,两年期公共SSL/TLS证书正式告别了行业,在三大浏览器(Apple Safari、 Google Chrome、Mozilla Firefox)的推动下,SSL/TLS证书最长有效期变更为13个月,同时,全球各大证书权威签发机构已停止签发有效期超过1年(398天)的SSL证书。
SSL/TLS证书1年有效期新规已至,被“证书过期”支配的恐惧又增加了!
|
存储 安全 搜索推荐
Session 和 Cookies 详解:差异与应用
【8月更文挑战第20天】
319 0
|
缓存 JavaScript 前端开发
理解回流跟重绘
【10月更文挑战第24天】回流和重绘是网页渲染过程中的重要概念,它们相互关联又各自具有不同的特点和影响。通过深入了解它们,我们可以更好地掌握页面性能优化的关键,为用户提供更加优质的浏览体验。
|
缓存 负载均衡 算法
优化拼多多关键词搜索接口:提高查询响应速度的技巧
在电商平台中,关键词搜索接口是用户寻找商品的重要途径。一个高效、快速的搜索接口能够极大地提升用户的购物体验。针对拼多多这样的大型电商平台,优化搜索接口的查询响应速度尤为重要。本文将深入探讨如何通过多种方法来优化拼多多关键词搜索接口。
|
存储 Java 关系型数据库
分布式定时任务框架Quartz总结和实践(2)—持久化到Mysql数据库
本文主要介绍分布式定时任务框架Quartz集成SpringBoot持久化数据到Mysql数据库的操作,上一篇文章使用Quartz创建定时任务都是保存在内存中,如果服务重启定时任务就会失效,所以Quartz官方也提供将定时任务等信息持久化到Mysql数据库的功能,本文主要实现这种Quartz的这种使用方式。
1937 0
分布式定时任务框架Quartz总结和实践(2)—持久化到Mysql数据库
|
关系型数据库 数据库 数据安全/隐私保护
Windows安装Postgresql之安装版
Windows安装Postgresql之安装版
413 0
Windows安装Postgresql之安装版
|
人工智能 数据挖掘 API
iOS MachineLearning 系列(20)—— 训练生成CoreML模型
本系列前面的文章详细的介绍了在iOS中与AI能力相关的API的使用,也介绍了如何使用训练好的CoreML模型来实现更强大的AI能力。然而,无论是成熟的API提供的能力,还是各种各样的三方模型,有时候都并不能满足某一领域内的定制化需求。当我们拥有很多的课训练数据,且需要定制化的AI能力时,其实就可以自己训练生成CoreML模型,将此定制化的模型应用到工程中去。
718 0
iOS MachineLearning 系列(20)—— 训练生成CoreML模型