天天看点

Quartz

Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目,完全基于 Java 实现。作为企业级别的定时任务调度,Quartz不仅仅拥有强大的调度功能,也支持各种灵活的应用方式,并同时支持分布式和集群能力。

Quartz的使用非常简单,首先在POM里面加入引用

然后在项目初始化的时候启动它

我们再定义一下定时任务要做啥

最后我们就可以增加一个定时任务了

是不是很简单,其实还有很多用法可以直接取官网上看查阅一下文档,就可以快速实现你的功能了。

<a href="http://www.quartz-scheduler.org/documentation/quartz-2.2.x/quick-start.html">http://www.quartz-scheduler.org/documentation/quartz-2.2.x/quick-start.html</a>

Quartz在启动过程中会默认读取classpath下的quartz.preperties文件完成一些初始化工作。在这里我们主要谈的是org.quartz.jobStore.class这个配置项。

Quartz官方支持三种数据存储方式

RAMJobStore

JDBCJobStore

TerracottaJobStore

说了这么多,其实都是Quartz的标准用法。在使用实践中因为各种原因导致没有办法使用官方提供的三种数据存储方式。所以只有自己动手丰衣足食,开辟新的玩法了。

在使用的时候我们会发现Quartz的建表脚本和公司idb不怎么兼容,尝试找过DBA,但是他们也不愿意为单独一个项目做特殊处理。这个时候我们就将视线投入到其他存储方式上了,首先祭出的就是MongoDB。

首先在POM里面引入第三方库

然后就和JDBCJobStore一样,在quartz.preperties中添加链接配置

如果要启动集群模式的话还需要加入下面的配置

还有一种情况下你会发现没有MongoDB可以使用。环绕四周,还有Redis在旁边。看看内存刑的KV Strore,想想它也可以被持久化到磁盘,于是咬咬牙也就用上了。不过遗憾的是受限于Redis,Quartz不能全功能发挥出来。主要的限制有下面几点

只支持SimpleTrigger和CronTrigger

对GroupMatcher来说,只支持StringOperatorName.EQUALS操作

org.quartz.scheduler.instanceName是不支持的,所以你得自己去维护trigger_group_name:trigger_name和job_group_name:job_name

没有办法使用transaction

JobDataMap的内容是作为String存储和返回

定时任务没有优先级概念,只在设定的时间内启动

不过瑕不掩瑜(其实是我们也用不上这些高级功能),我们还是可以克服困难愉快的用上Quartz的。首先还是要引入三方包

其次还是配置一下quartz.preperties

最后别忘了配置你的Jedis

<a href="http://www.quartz-scheduler.org/">http://www.quartz-scheduler.org/</a>

<a href="https://github.com/michaelklishin/quartz-mongodb">https://github.com/michaelklishin/quartz-mongodb</a>

<a href="https://github.com/jlinn/quartz-redis-jobstore">https://github.com/jlinn/quartz-redis-jobstore</a>

转载自:https://yq.aliyun.com/articles/62959