热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java任务调度框架_Java任务调度框架Quartz入门

Quartz[kwɔːts]:石英,其框架和名字一样简单朴素又不失魅力,在Java程序界,Quartz大名鼎鼎,

Quartz[kwɔːts]:石英,其框架和名字一样简单朴素又不失魅力,在Java程序界,Quartz大名鼎鼎,很多Java应用几乎都集成或构建了一个定时任务调度系统,Quartz是一个定时任务调度框架(Quartz官网:http://www.quartz-scheduler.org/)。这个工具

在美团中的有大量使用,详见他们的官方博客:http://tech.meituan.com/ 。Quartz是一个很轻量级的java库,几乎包含了所有定时的功能。主要接口是Schedule,提供了一些简单的操作:安排任务或取消任务,启动或者停止任务。如果你想在应用中使用Quartz,

应该实现Job接口,包含了一个execute()方法。如果你想在一个任务执行时间到了的时候通知你,组件应该实现TriggerListener 或者JobListener 接口。Quartz任务可以在你的应用中启动和执行,可以作为一个独立的应用程序(通过RMI接口[即Remote Method

Invoke 远程方法调用]),也可是在一个J2EE应用中执行。

1. 何为定时任务调度框架?

简而言之,它可以领会我们的意图在未来某个时刻做我们想要做的事情,比如,每月月末的财务报表给财务部门,定时给领导发个邮件短信等等。这时候我们就需要用到任务调度框架Quartz了。其不仅简单易使用,并且可以与spring集成(这才是重点哦!就目前而

言,一个Java项目其基础框架不外乎SSH(struts2+spring+hibernate)、SSM(springMVC+spring+mybatis)。当然,也有一些团队喜欢springMVC+spring+hibernate这样搭建。不过,无论是那种搭配spring几乎是不可或缺的)。任务调度本身涉及到多线程

并发、运行时间规则制定和解析、场景保持与恢复、线程池维护等诸多方面的工作。如果直接使用自定义线程这种刀耕火种的原始办法,开发任务调度程序是一项颇具挑战性的工作。Java开源的好处就是:领域问题都能找到现成的解决方案(所以圈里也流行这么一句:

天上飞的理念,必有落地的产品)。

但任务调度除以时间为关注点外,还应考虑资源的分配。大多数系统都要对资源使用进行控制:服务线程的最大数目必须限额;考虑使用线程池以便共享服务的线程资源、降低频繁创建、销毁线程的消耗。

2. Quartz是什么?

Quartz是一个任务调度框架(库),它几乎可以集成到任何应用系统中。术语”job schedule”似乎为不同的人提供了不同的想法。总之,作业调度是负责执行(或通知)其他软件组件在预定时间执行的服务组件。虽然通过schedule可以简单实现一些系统任务定时执

行,当您学习如何使用它来驱动应用程序的业务流程的流程时,Quartz的全部潜力是可以实现的。

3. Quartz的一些特点

1)非常灵活的,并包含多个使用范例,它们可以单独或一起使用,以实现您所期望的行为,并使您能够以最“自然”的方式来编写您的项目的代码。

2)非常轻量级的,只需要非常少的配置 —— 它实际上可以被跳出框架来使用,如果你的需求是一些相对基本的简单的需求的话。

3)具有容错机制,并且可以在重启服务的时候持久化你的定时任务,你的任务也不会丢失。

4)不是一个任务队列——虽然它确实可以在一些小规模应用中合理的作为一个任务队列来使用。

5)不是一个网格计算引擎——虽然在某些小规模应用中,这样做确实可以达到应用的要求(定时计算、统计一些数据)。

6)不是一个提供给业务人员的执行服务——它是一个库,很容易集成到应用程序中去做一些未来某时刻可能会一直循环执行的相关的任务。

4. 综观目前的 Web 应用,多数应用都具备任务调度的功能。几种任务调度的 Java 实现方法,包括 Timer,Scheduler, Quartz 以及 JCron Tab等等,其优缺点进行比较,本文不做重点介绍。如有兴趣可以参考以下文章(Spring提供的三种定时任务机制及其比

5. Quartz 基础结构

Quartz 对任务调度的领域问题进行了高度抽象,提出了调度器、任务和触发器 3 个核心概念,并在 org.quartz 中通过接口和类对核心概念进行描述。

Job:接口。开发者通过实现该接口定义需要执行的任务。

JobDetail:Quartz 在每次执行 Job 时,都重新创建一个 Job 实例,所以它不是直接接受一个 Job 的实例,而是接受一个 Job 实现类,以便运行时通过反射机制实例化 Job。因此需要一个类来描述 Job 的实现类及其他相关的静态信息,如 Job 名称、描述、关联

的监听器等,JobDetail 承担了这一角色。

Trigger:描述触发 Job 执行的时间触发规则。主要有 SimpleTrigger、CronTrigger 两个实现类。

SimpleTrigger:当仅需要触发一次或者以固定间隔周期执行时。

CronTrigger:可以通过 Cron 表达式定义出各种复杂的调度方案。

Calendar:一些日历特定时间点的集合(可以简单的理解为 java.util.Calendar 的集合:java.util.Calendar )。一个 Trigger 可以和多个 Calendar 关联,以便包含或排除某些时间点。

Scheduler:一个 Quartz 的独立运行容器,Trigger 和 JobDetail 可以注册到 Scheduler 中,两者在 Scheduler 中拥有各自的组及名称。组及名称是 Scheduler 查找容器中某一对象的依据,Trigger 和 JobDetail 的组及名称的组合都必须唯一(但 Scheduler

和 Trigger 的组合名称可以相同,因为他们是不同的类型,处于不同的容器中)。Scheduler 可以将 Trigger 绑定到某一个 JobDetails 中,这样当 Trigger 被触发时,对应的 Job 就被执行。一个 Job 可以对应多个 Trigger,但一个 Trigger 只能对应一个 Job。

6. 使用 SimpleTrigger

步骤:

实现 Job 接口,可使 Java 类变为可调度的任务;

创建描述 Job 的 JobDetail 对象;

创建 SimpleTrigger 对象;

设置触发 Job 执行的时间规则;

通过 SchedulerFactory 获取 Scheduler 对象;

向 SchedulerFactory 中注册 JobDetail 和 Trigger;

启动调度任务。

f64471432c4fe176c6c2da908067ba6b.png

07b456cbcd1de5c27e4d740c824aa8ae.png

076164e38a863476fc871aabaaf6a4d3.png

96c584d94fb62610eaf3b9c098c2b416.png

7bbaf81dc2e3577976edbb6ddd54362c.png

7.  使用 CronTrigger

CronTriggr 能够提供比 SimpleTrigger 更有具体实际意义的调度方案,调度规则基于 Cron 表达式,CronTrigger 支持日历相关的重复时间间隔(例如:每月第一个周一执行),而不是简单的周期时间间隔。

8.  Cron 表达式

Quartz 使用类似于 Linux 下的 Cron 表达式定义时间规则,Cron 表达式由 6 或 7 个空格分隔的时间字段组成。

Cron 表达式对特殊字符的大小写不敏感.

d86edf4cbc9602234209e87f9ea0ffad.png

9.  Cron 表达式中的特殊字符

*:可用于所有字段,表示对应时间域的每一个时刻。例如:* 在分钟字段时,表示 每分钟

?:只能用在日期和星期字段中,表示一个毫无意义的值,相当于占位符

-:表示一个范围。例如:在小时字段中使用 10-12,表示从 10 点到 12 点。即 10,11, 12

,:表示一个列表值。例如:在星期字段中使用 MON,WED,FRI,表示星期一,星期三,星期五

/:x/y 表示一个等步长序列,x 为起始值,y 为增量步长。例如:在分钟字段中使用 0/15,则表示为 0,15,30 和 45 秒;而 5/15 在分钟字段表示 5,20,35,50 。*/y 等同于 0/y

L:该字符只在日期和星期字段中使用,代表 Last。

L 用在日期字段中,代表这个月的最后一天

L 用在星期字段中,代表星期六

若 L 出现在星期字段里,且前面有一个数值 X,则表示 这个月的最后星期 X,例如 6L 表示该月的最后一个星期五

W:该字符只能出现在日期字段里,是对前导日期的修饰,表示离该日期最近的工作日。例如:15W 表示离该月 15 号最近的工作日:若 15 号是星期六,则匹配 14 号;若 15 号是星期日,则匹配 16 号;若 15 号是星期二,则匹配 15 号。

注意1:关联的匹配日期不能跨月。例如用户指定 1W,若 1 号是星期六,则匹配 3 号。

注意2:W 字符串只能指定单一日期,而不能指定日期范围。

LW:在日期字段可以组合使用 LW,意为当月的最后一个工作日

#:只能在星期字段中使用,表示当月某个工作日。例如:6#3 表示当月的第三个星期五(6表示星期五,#3表示当月的第三个),4#5 表示当月的第五个星期三,若没有第五个星期三,则忽略不触发

C:该字符只在日期和星期字段中使用,代表 Calendar。意为计划所关联的日期,如果日期没有被关联,则相当于日历中所有日期。例如:5C 在日期字段中就相当于 5 日以后的第一天。1C 在星期字段中相当于星期日后的第一天。

10.  Cron 表达式示例

0 0 12 * * ?:每天中午12点触发

0 15 10 ? * *:每天上午10:15触发

0 15 10 * ? *: 每天上午10:15触发

0 15 10 * * ?: 每天上午10:15触发

0 15 10 * * ? 2005: 2005年的每天上午10:15触发

0 * 14 * * ?:在每天下午2点到下午2:59期间的每1分钟触发

0 0/5 14 * * ?:在每天下午2点到下午2:55期间的每5分钟触发

0 0/5 14, 18 * * ?:在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟,触发

0 0-5 14 * * ?:在每天下午2点到下午2:05期间的每1分钟触发

0 10,44 14 ? 3 WED:每年三月的星期三的下午2:10和2:44触发

0 15 10 ? * MON-FRI:周一至周五的上午10:15 触发

0 15 10 15 * ?:每月15日上午10:15 触发

0 15 10 L * ?:每月最后一日的上午10:15 触发

0 15 10 ? * 6L:每月的最后一个星期五上午10:15 触发

0 15 10 ? * 6L 2002-2005:2002年至2005年的每月的最后一个星期五上午10:15触发

0 15 10 ? * 6#3:每月的第三个星期五上午10:15触发

11. 在 Spring 中使用 Quartz

Spring 进一步降低了使用 Quartz 的难度:

为创建 Quartz 的 Scheduler、Trigger 和 JobDetail 提供了便利的 FactoryBean 类,以便能够在 Spring 容器中享受注入.

在 Spring 中配置 JobDetail :

Spring 提供了一个 MethodInvokingJobDetailFactoryBean, 通过这个 FactoryBean 可以将 Spring 容器中 Bean 的方法包装成 Quartz 任务,这样就不必为 Job 创建对应的类了.

28dea183142c20fd09bc791ad4255d8a.png

12. 在 Spring 中配置 CronTrigger

Spring 为 CronTrigger 提供了更具 Bean 风格的 CronTriggerFactoryBean.

1bf84dee505fb8c48e0c1680dc9fb6d3.png

13. 在 Spring 中配置 Secheduler

Spring 提供了 SchedulerFactoryBean,这个 Bean 拥有如下功能:

以更具有 Bean 风格的方式为 Scheduler 提供配置信息。

让 Scheduler 和 Spring IOC 容器的生命周期建立关联:IOC 容器启动后,Secheduler 开始工作,IOC 容器关闭前,自动关闭 Scheduler。

startupDelay 属性:在 SchedulerFactoryBean 初始化完成后,延迟多少秒启动 Scheduler,默认为 0,即立即启动。一般情况下,可以通过设置该属性使 Scheduler 延迟一小段时间后启动,以便让 Spring 能够更快初始化容器中的其它 Bean。

quartzPorperties属性:类型为 Properties,允许在 Spring 中定义 Quartz 的属性。其值将覆盖 quartz.properties 配置文件中的配置。

02def4fe7f9a7a28df3e531e131759d3.png

本文只是Quartz的一个入门,接下来我会逐步推出Quartz的高级用法和在实际项目中的Demo。获知及时信息,请关注我的个人微信订阅号:0与1的那点事

本文为博主原创文章,转载请注明出处!

http://www.cnblogs.com/libingbin/

感谢您的阅读。



推荐阅读
  • 小程序自动授权和手动接入的方式及操作步骤
    本文介绍了小程序支持的两种接入方式:自动授权和手动接入,并详细说明了它们的操作步骤。同时还介绍了如何在两种方式之间切换,以及手动接入后如何下载代码包和提交审核。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 本文介绍了Sencha Touch的学习使用心得,主要包括搭建项目框架的过程。作者强调了使用MVC模式的重要性,并提供了一个干净的引用示例。文章还介绍了Index.html页面的作用,以及如何通过链接样式表来改变全局风格。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • 2016 linux发行版排行_灵越7590 安装 linux (manjarognome)
    RT之前做了一次灵越7590黑苹果炒作业的文章,希望能够分享给更多不想折腾的人。kawauso:教你如何给灵越7590黑苹果抄作业​zhuanlan.z ... [详细]
  • 本文介绍了ASP.NET Core MVC的入门及基础使用教程,根据微软的文档学习,建议阅读英文文档以便更好理解,微软的工具化使用方便且开发速度快。通过vs2017新建项目,可以创建一个基础的ASP.NET网站,也可以实现动态网站开发。ASP.NET MVC框架及其工具简化了开发过程,包括建立业务的数据模型和控制器等步骤。 ... [详细]
  • Linux下安装免费杀毒软件ClamAV及使用方法
    本文介绍了在Linux系统下安装免费杀毒软件ClamAV的方法,并提供了使用该软件更新病毒库和进行病毒扫描的指令参数。同时还提供了官方安装文档和下载地址。 ... [详细]
  • 本文讨论了在ASP中创建RazorFunctions.cshtml文件时出现的问题,即ASP.global_asax不存在于命名空间ASP中。文章提供了解决该问题的代码示例,并详细解释了代码中涉及的关键概念,如HttpContext、Request和RouteData等。通过阅读本文,读者可以了解如何解决该问题并理解相关的ASP概念。 ... [详细]
  • 本文介绍了在RHEL 7中的系统日志管理和网络管理。系统日志管理包括rsyslog和systemd-journal两种日志服务,分别介绍了它们的特点、配置文件和日志查询方式。网络管理主要介绍了使用nmcli命令查看和配置网络接口的方法,包括查看网卡信息、添加、修改和删除配置文件等操作。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • Django + Ansible 主机管理(有源码)
    本文给大家介绍如何利用DjangoAnsible进行Web项目管理。Django介绍一个可以使Web开发工作愉快并且高效的Web开发框架,能够以最小的代价构建和维护高 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了markdown[软件代理设置]相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
行者05965
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有