博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
定时任务框架Quartz的新玩法
阅读量:6757 次
发布时间:2019-06-26

本文共 3941 字,大约阅读时间需要 13 分钟。

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

基本使用

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

org.quartz-scheduler
quartz
2.2.1
org.quartz-scheduler
quartz-jobs
2.2.1

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

Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();scheduler.start();

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

public class MyJob implements org.quartz.Job {      public MyJob() {      }      public void execute(JobExecutionContext context) throws JobExecutionException {          System.err.println("Hello World!  MyJob is executing.");      }  }

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

// 定义一个要执行的Job  JobDetail job = newJob(MyJob.class)      .withIdentity("job1", "group1")      .build();  // 定义一个间隔40秒运行的Trigger  Trigger trigger = newTrigger()      .withIdentity("trigger1", "group1")      .startNow()      .withSchedule(simpleSchedule()              .withIntervalInSeconds(40)              .repeatForever())      .build();  // 告诉Quartz去用trigger安排启动job  scheduler.scheduleJob(job, trigger);

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

提高篇

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

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

  1. RAMJobStore

    RAMJobStore是默认的数据存储方式,其把数据存在本地内存中,官方宣称这是最有效率的方式(在本地内存当然快啦)。但是在宕机或者重启的时候数据就会丢失。
    //配置方式org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
  2. JDBCJobStore

    JDBCJobStore终于把数据给持久化起来了,这个也是使用最广泛的数据存储方式。在于Spring集成后都不需要自己再配置一遍数据库连接了。建表脚本在官方包里面可以找到(http://www.quartz-scheduler.org/downloads/)
    //配置方式org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTXorg.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegateorg.quartz.jobStore.tablePrefix = QRTZ_org.quartz.jobStore.dataSource = myDS
  3. TerracottaJobStore

    在Quartz被Software AG收购后免不了要夹带一些私货。这个就是专门给Terracotta配置的。我也就懒得讲了,大家网上搜搜吧。

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

进阶篇 --- MongoDB

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

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

com.novemberain
quartz-mongodb
2.0.0
org.mongodb
mongo-java-driver
3.2.2

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

org.quartz.jobStore.class=com.novemberain.quartz.mongodb.MongoDBJobStoreorg.quartz.jobStore.mongoUri=${mongo.hostName}org.quartz.jobStore.dbName=quartzorg.quartz.jobStore.collectionPrefix=mycolorg.quartz.threadPool.threadCount=1

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

org.quartz.scheduler.instanceName = MyClusteredSchedulerorg.quartz.scheduler.instanceId = AUTOorg.quartz.jobStore.isClustered = true

进阶篇 --- Redis

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

  1. 只支持SimpleTrigger和CronTrigger
  2. 对GroupMatcher来说,只支持StringOperatorName.EQUALS操作
  3. org.quartz.scheduler.instanceName是不支持的,所以你得自己去维护trigger_group_name:trigger_name和job_group_name:job_name
  4. 没有办法使用transaction
  5. JobDataMap的内容是作为String存储和返回
  6. 定时任务没有优先级概念,只在设定的时间内启动

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

net.joelinn
quartz-redis-jobstore
1.1.3
redis.clients
jedis
2.9.0

其次还是配置一下quartz.preperties

org.quartz.jobStore.class = net.joelinn.quartz.jobstore.RedisJobStoreorg.quartz.jobStore.host = ${redis.hostName}org.quartz.jobStore.password = ${redis.password}org.quartz.jobStore.port = ${redis.port}org.quartz.jobStore.database: ${redis.database.quartz}

最后别忘了配置你的Jedis

参考链接

转载地址:http://bezeo.baihongyu.com/

你可能感兴趣的文章
auto,register,static分析
查看>>
百度BAE JAVA环境项目部署和调试
查看>>
CSS盒模型
查看>>
Log4Net 添加自定义字段并保存到数据库
查看>>
Redis集群(三)Cluster集群
查看>>
NSURLSession
查看>>
JFinal学习 & Gradle配置续 & Tomcat配置
查看>>
CSS进度条
查看>>
android的color值
查看>>
对于linux下system()函数的深度理解(整理)
查看>>
软件设计和开发准备
查看>>
ROS + Kinect2 跑ORB_SLAM2 安装步骤记录
查看>>
纯CSS实现垂直居中的几种方法
查看>>
win7注册表常用设置
查看>>
amazeui学习笔记--css(常用组件3)--按钮组Button-group
查看>>
Spring简介
查看>>
new Function()
查看>>
man page分類與說明
查看>>
站立会议3
查看>>
Libvirt 版本降级过程记录 4.5.0 to 3.9.0
查看>>