定时任务框架Quartz的新玩法

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

基本使用

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

<!-- Quartz -->
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.2.1</version>
</dependency>
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz-jobs</artifactId>
    <version>2.2.1</version>
</dependency>

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

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);

是不是很简单,其实还有很多用法可以直接取官网上看查阅一下文档,就可以快速实现你的功能了。
http://www.quartz-scheduler.org/documentation/quartz-2.2.x/quick-start.html

提高篇

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.JobStoreTX
    org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
    org.quartz.jobStore.tablePrefix = QRTZ_
    org.quartz.jobStore.dataSource = myDS
    
  3. TerracottaJobStore
    在Quartz被Software AG收购后免不了要夹带一些私货。这个就是专门给Terracotta配置的。我也就懒得讲了,大家网上搜搜吧。

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

进阶篇 --- MongoDB

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

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

<dependency>
    <groupId>com.novemberain</groupId>
    <artifactId>quartz-mongodb</artifactId>
    <version>2.0.0</version>
</dependency>
<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongo-java-driver</artifactId>
    <version>3.2.2</version>
</dependency>

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

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

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

org.quartz.scheduler.instanceName = MyClusteredScheduler
org.quartz.scheduler.instanceId = AUTO
org.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的。首先还是要引入三方包

<dependency>
    <groupId>net.joelinn</groupId>
    <artifactId>quartz-redis-jobstore</artifactId>
    <version>1.1.3</version>
</dependency>

<!-- Redis -->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>

其次还是配置一下quartz.preperties

org.quartz.jobStore.class = net.joelinn.quartz.jobstore.RedisJobStore
org.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

    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxTotal" value="${redis.pool.maxTotal}"></property>
        <property name="maxIdle" value="${redis.pool.maxIdle}"></property>
        <property name="minIdle" value="${redis.pool.minIdle}"></property>
        <property name="maxWaitMillis" value="${redis.pool.maxWaitMillis}"></property>
        <property name="minEvictableIdleTimeMillis" value="${redis.pool.minEvictableIdleTimeMillis}"></property>
        <property name="numTestsPerEvictionRun" value="${redis.pool.numTestsPerEvictionRun}"></property>
        <property name="timeBetweenEvictionRunsMillis" value="${redis.pool.timeBetweenEvictionRunsMillis}"></property>
        <property name="testOnBorrow" value="true"></property>
        <property name="testOnReturn" value="true"></property>
        <property name="testWhileIdle" value="true"></property>
    </bean>

    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="hostName" value="${redis.hostName}"/>
        <property name="port" value="${redis.port}"/>
        <property name="timeout" value="${redis.timeout}"/>
        <property name="database" value="${redis.database.crowd}"/>
        <property name="password" value="${redis.password}"/>
        <property name="usePool" value="true"/>
        <property name="poolConfig" ref="jedisPoolConfig"/>
    </bean>

参考链接

  1. http://www.quartz-scheduler.org/
  2. https://github.com/michaelklishin/quartz-mongodb
  3. https://github.com/jlinn/quartz-redis-jobstore
时间: 2024-11-02 04:00:55

定时任务框架Quartz的新玩法的相关文章

有道智选研发副总经理陈彧:原生营销新玩法

10月23-24日,由艾瑞咨询集团主办的"2014上海艾瑞互联网营销峰会"在上海浦东嘉里大酒店隆重举办.作为艾瑞年度高峰会议的第三站,2014上海艾瑞互联网营销峰会延续了此前北京.深圳两场峰会"守正出奇·融合创新"的主题,以"营销"作为切入点,邀请诸多行业内的重量级嘉宾分享营销案例与心得,探讨互联网营销的变革与创新,为新经济时代下的互联网营销模式把脉.以下是有道智选研发副总经理陈彧发表的以"原生营销新玩法"为主题的演讲实录:有

百度搜索有什么新玩法?

  你造吗?新版百度不光是搜索那么简单,还有更多个性化体验哦,搜索旋转跳跃闪烁抖动效果好酷炫!小编在这里为大家分享百度搜索新玩法. 百度搜索新玩法 搜索旋转跳跃闪烁抖动效果好酷炫 不信你试试,小编都试了个遍,有趣咧. 温馨提示:用电脑网页版哦,手机百度不行的.

运动的云上新玩法:咕咚LBS场景实践

摘要:10月13日2016杭州云栖大会拉开帷幕,位置服务专场的CEO申波带来了"咕咚:位置服务,数据如何让运动更好玩有趣"的重要演讲.本次分享从咕咚的进化开始谈起,进而讲到社区+工具的运动核心点,重点介绍了LBS场景下精准的运动轨迹.社交以及O2O,最后分享了咕咚的线上新玩法.一起来欣赏吧--   以下内容根据演讲PPT及现场分享整理:  本文从咕咚的进化开始谈起,进而讲到社区+工具的运动核心点,重点介绍了LBS场景下精准的运动轨迹.社交以及O2O,最后分享了咕咚的线上新玩法. 以下为

人脸识别向保险业的渗透,未来保险会有哪些新玩法?

人工智能时代,对保险行业充满着机遇.2016年,我国保险行业保费收入达3万亿元,快速跃居世界第二.伴随行业的快速发展和保险受众群体的日益扩大,社会各方对保险产品和服务质量.效率等都有新的期待. 根据调查显示,国内保险客户反馈对险企的改进期待之中,排名前三位的是:更个性化的服务.更安全的隐私保护以及更简单便捷的操作流程. 这一结果并不令人感到意外,要知道,保险行业在投保.理赔.运营三个核心环节仍存在很多痛点,如今的APP几乎能完成大部分流程操作,即便在一定程度上减少了人工审核工作, 但是智能科技的

Youni引爆社交支付最潮新玩法 土豪打赏 点赞福音

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;   硅谷网讯 随着手机移动网络 社交APP市场的日趋火爆,盛大Youni(有你)以创新.差异化.独到的定位逐渐脱颖而出,在日前 刚刚开幕的第六届新媒体节,荣获年度中国APP热门应用TOP10,成为备受业界瞩目的一匹黑马. 其中,盛大Youni(有你)最受瞩目的是它的社交支付功能,Youni用户可以与手机通讯录中的联系人随时随地发送消息,甚至发钱收钱."Yo

众信金融618周年庆 移动金融营销新玩法

本文讲的是众信金融618周年庆 移动金融营销新玩法,在当前"互联网+"的背景下,P2P作为新兴理财模式正逐渐成为一种趋势,获得了广泛的关注.随着P2P行业的迅猛发展,加剧了平台对网络营销的竞争.各大平台通过促销福利活动来抢占市场份额,花样百出,如最近的e人e贷的周年庆活动,用户关注官方微信可刮取红包;投哪网三周年庆典,用户通过抽奖获积分,赢取iPhone6等.近日,国资系P2P众信金融也推出了周年庆活动,以用户参与"大黑牛追范冰棒"趣味答题的游戏方式领取加息券,该活

360院线新玩法,电影在线放映“零窗口期”

去年12月光线传媒宣布与360成立视频网站后,业内外便给予了这家视频网站较高的关注度.沉默了一段时间的360院线近日正式上线,并亮出自己的新玩法:电影在线放映"零窗口期". 以往,制片方出于对票房的保护,影片通常要在影院下线一段时间以后才可以在网络上供在线用户点播,这段时间也被称为窗口期.而如今,正在360网络院线上映影片<冲上云霄>则首次尝试零窗口期,在电影尚未完全下线的情况下便登陆网络播放平台. 对于视频网站而言,此举有助于其在短时间内抢占市场份额:对于行业而言,随着零

DDoS攻击新玩法 暴雪上演营销新方式

本文讲的是 :  DDoS攻击新玩法 暴雪上演营销新方式  ,  [IT168 评论]格林尼治时间8月23日,暴雪宣布遭受大规模DDoS攻击,袭击目标为公司的游戏服务器,暴雪公司旗下的守望先锋,炉石传说,魔兽世界等热门网络游戏均受到了影响.有消息称此次攻击致使其在欧盟和美国地区的网络瘫痪,用户无法通过服务器进行验证登录和正常游戏. 本次DDoS攻击事件距离8月2日的DDoS攻击事件仅仅不到一个月的事件,一个月内连续遭受两次DDoS攻击,着实打脸.但奇怪的是本次DDoS攻击事件发生后并没有任何组织

老司机带你体验SYS库多种新玩法

如何更加愉快地利用sys库做一些监控? 快来,跟上老司机,体验sys库的多种新玩法~ MySQL5.7的新特性中,非常突出的特性之一就是sys库,不仅可以通过sys库完成MySQL信息的收集,还可以用来监控和排查问题. 但你知道吗,sys库其实还有很多种玩法,有的或许单看表名就知道了,但有一些,还是需要老司机带路哦~ 一.用户.连接类 1.查看每个客户端IP过来的连接消耗资源情况. 2.查看每个用户消耗资源情况 3.查看当前连接情况(有多少连接就应该有多少行) 4.查看当前正在执行的SQL和执行