【Quartz】Quartz概述及入门实例

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。

  Quartz 在开源任务调度框架中的翘首,它提供了强大任务调度机制,难能可贵的是它同时保持了使用的简单性。Quartz 允许开发人员灵活地定义触发器的调度时间表,并可以对触发器和任务进行关联映射。
        此外,Quartz提供了调度运行环境的持久化机制,可以保存并恢复调度现场,即使系统因故障关闭,任务调度现场数据并不会丢失。此外,Quartz还提供了组件式的侦听器、各种插件、线程池等功能。

一、Quartz功能概述

Quartz是一个开源的任务调度系统,它能用来调度很多任务的执行。

运行环境

  • Quartz 能嵌入在其他应用程序里运行。
  • Quartz 能在一个应用服务器里被实例化(或servlet容器), 并且参与XA事务
  • Quartz能独立运行(通过JVM),或者通过RMI
  • Quartz能被集群实例化

任务调度

当一个指定给任务的触发器发生时,任务就被调度执行.触发器能被创建为:

  • 一天的某个时间(精确到毫秒级)
  • 一周的某些天
  • 一个月的某些天
  • 一年的某些天
  • 不在一个Calendar列出的某些天 (例如工作节假日)
  • 在一个指定的次数重复
  • 重复到一个指定的时间/日期
  • 无限重复
  • 在一个间隔内重复

能够给任务指定名称和组名.触发器也能够指定名称和组名,这样可以很好的在调度器里组织起来.一个加入到调度器里的任务可以被多个触发器注册。在J2EE环境里,任务能作为一个分布式(XA)事务的一部分来执行。

任务执行

  • 任务能够是任何实现Job接口的Java类。
  • 任务类能够被Quartz实例化,或者被你的应用框架。
  • 当一个触发器触发时,调度器会通知实例化了JobListener 和TriggerListener 接口的0个或者多个Java对象(监听器可以是简单的Java对象, EJBs, 或JMS发布者等). 在任务执行后,这些监听器也会被通知。
  • 当任务完成时,他们会返回一个JobCompletionCode ,这个代码告诉调度器任务执行成功或者失败.这个代码 也会指示调度器做一些动作-例如立即再次执行任务。

任务持久化

  • Quartz的设计包含JobStore接口,这个接口能被实现来为任务的存储提供不同的机制。
  • 应用JDBCJobStore, 所有被配置成“稳定”的任务和触发器能通过JDBC存储在关系数据库里。
  • 应用RAMJobStore, 所有任务和触发器能被存储在RAM里因此不必在程序重起之间保存-一个好处就是不必使用数据库。

事务

  • 使用JobStoreCMT(JDBCJobStore的子类),Quartz 能参与JTA事务。
  • Quartz 能管理JTA事务(开始和提交)在执行任务之间,这样,任务做的事就可以发生在JTA事务里。

集群

  • Fail-over.
  • Load balancing.

监听器和插件

  • 通过实现一个或多个监听接口,应用程序能捕捉调度事件来监控或控制任务/触发器的行为。
  • 插件机制可以给Quartz增加功能,例如保持任务执行的历史记录,或从一个定义好的文件里加载任务和触发器。
  • Quartz 装配了很多插件和监听器。

 

二、Quartz体系结构

 

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

●Job

       是一个接口,只有一个方法voidexecute(JobExecutionContext context),开发者实现该接口定义运行任务,JobExecutionContext类提供了调度上下文的各种信息。Job运行时的信息保存在 JobDataMap实例中;

●JobDetail

        Quartz在每次执行Job时,都重新创建一个Job实例,所以它不直接接受一个Job的实例,相反它接收一个Job实现 类,以便运行时通过newInstance()的反射机制实例化Job。因此需要通过一个类来描述Job的实现类及其它相关的静态信息,如Job名字、描 述、关联监听器等信息,JobDetail承担了这一角色。

通过该类的构造函数可以更具体地了解它的功用:JobDetail(java.lang.String name, java.lang.String group,java.lang.Class jobClass),该构造函数要求指定Job的实现类,以及任务在Scheduler中的组名和Job名称;

●Trigger

       是一个类,描述触发Job执行的时间触发规则。主要有SimpleTrigger和CronTrigger这两个子类。当仅需触 发一次或者以固定时间间隔周期执行,SimpleTrigger是最适合的选择;而CronTrigger则可以通过Cron表达式定义出各种复杂时间规 则的调度方案:如每早晨9:00执行,周一、周三、周五下午5:00执行等;

●Calendar

       org.quartz.Calendar和java.util.Calendar不同,它是一些日历特定时间点的集合(可以简 单地将org.quartz.Calendar看作java.util.Calendar的集合——java.util.Calendar代表一个日历时间点,无特殊说明后面的Calendar即指org.quartz.Calendar)。一个Trigger可以和多个Calendar关联,以便排除或 包含某些时间点。

假设,我们安排每周星期一早上10:00执行任务,但是如果碰到法定的节日,任务则不执行,这时就需要在Trigger触发机制的基础上使用 Calendar进行定点排除。针对不同时间段类型,Quartz在org.quartz.impl.calendar包下提供了若干个Calendar 的实现类,如AnnualCalendar、MonthlyCalendar、WeeklyCalendar分别针对每年、每月和每周进行定义;

●Scheduler

        代表一个Quartz的独立运行容器,Trigger和JobDetail可以注册到Scheduler中,两者在 Scheduler中拥有各自的组及名称,组及名称是Scheduler查找定位容器中某一对象的依据,Trigger的组及名称必须唯一,JobDetail的组和名称也必须唯一(但可以和Trigger的组和名称相同,因为它们是不同类型的)。Scheduler定义了多个接口方法, 允许外部通过组及名称访问和控制容器中Trigger和JobDetail。

        Scheduler可以将Trigger绑定到某一JobDetail中,这样当Trigger触发时,对应的Job就被执行。一个Job可以对应 多个Trigger,但一个Trigger只能对应一个Job。可以通过SchedulerFactory创建一个Scheduler实例。 Scheduler拥有一个SchedulerContext,它类似于ServletContext,保存着Scheduler上下文信息,Job和 Trigger都可以访问SchedulerContext内的信息。SchedulerContext内部通过一个Map,以键值对的方式维护这些上下文数据,SchedulerContext为保存和获取数据提供了多个put()和getXxx()的方法。可以通过Scheduler# getContext()获取对应的SchedulerContext实例;

三、入门实例

本文工程免费下载

新建一个Java project.

导入相应的包

执行业务逻辑的Job

 

 
  1. package com.mucfc;
  2. import java.text.SimpleDateFormat;
  3. import java.util.Date;
  4. import org.quartz.Job;
  5. import org.quartz.JobExecutionContext;
  6. import org.quartz.JobExecutionException;
  7. /**
  8. *Quartz事件类
  9. *作者 林炳文(ling20081005@126.com 博客:http://blog.csdn.net/evankaka)
  10. *时间 2015.4.29
  11. */
  12. public class Quartz implements Job{
  13. /**
  14. * 事件类,处理具体的业务
  15. */
  16. @Override
  17. public void execute(JobExecutionContext arg0) throws JobExecutionException {
  18. System.out.println("Hello quzrtz "+
  19. new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ").format(new Date()));
  20. }
  21. }


任务调度

 

 

 
  1. package com.mucfc;
  2. import org.quartz.JobBuilder;
  3. import org.quartz.JobDetail;
  4. import org.quartz.Scheduler;
  5. import org.quartz.SchedulerException;
  6. import org.quartz.SimpleScheduleBuilder;
  7. import org.quartz.Trigger;
  8. import org.quartz.TriggerBuilder;
  9. import org.quartz.impl.StdSchedulerFactory;
  10. /**
  11. *Quartz定时执行事件
  12. *作者 林炳文(ling20081005@126.com 博客:http://blog.csdn.net/evankaka)
  13. *时间 2015.4.29
  14. */
  15. public class QuartzTest {
  16. public static void main(String[] args) {
  17. QuartzTest quartzTest=new QuartzTest();
  18. quartzTest.startSchedule();
  19. }
  20. public void startSchedule() {
  21. try {
  22. // 1、创建一个JobDetail实例,指定Quartz
  23. JobDetail jobDetail = JobBuilder.newJob(Quartz.class)
  24. // 任务执行类
  25. .withIdentity("job1_1", "jGroup1")
  26. // 任务名,任务组
  27. .build();
  28. //2、创建Trigger
  29. SimpleScheduleBuilder builder=SimpleScheduleBuilder.simpleSchedule()
  30. //设置间隔执行时间
  31. .withIntervalInSeconds(5)
  32. //设置执行次数
  33. .repeatForever();
  34. Trigger trigger=TriggerBuilder.newTrigger().withIdentity(
  35. "trigger1_1","tGroup1").startNow().withSchedule(builder).build();
  36. //3、创建Scheduler
  37. Scheduler scheduler=StdSchedulerFactory.getDefaultScheduler();
  38. scheduler.start();
  39. //4、调度执行
  40. scheduler.scheduleJob(jobDetail, trigger);
  41. try {
  42. Thread.sleep(60000);
  43. } catch (InterruptedException e) {
  44. e.printStackTrace();
  45. }
  46. scheduler.shutdown();
  47. } catch (SchedulerException e) {
  48. e.printStackTrace();
  49. }
  50. }
  51. }

(注意这里,通过静态import,直接就newJob****。)

 

 

 

输出结果:

这里要注意,定时事件不是在主线程中执行的,而是会开另外的线程来执行。并且当主线程休眠1分钟后,会把定时事件给关了,这里即使不会无限执行的事件,也要用shutdown();关闭掉,要不定时事件的线程不会释放资源!

转自:http://blog.csdn.net/evankaka

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/448973.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python中del语句

有一种方式可以从列表按照给定的索引而不是值来移除一个元素: 那就是 del 语句。 它不同于会返回一个值的 pop() 方法。 del 语句也可以用来从列表中移除切片或者清空整个python列表(我们之前用过的方式是将一个空列表赋值给指定的切片)。 例如: >>…

偷时间的孩子

从事临床心理工作已有十三、四年(至一九九五年),真的有很多话想跟父母们敞开心扉的谈谈。 忙碌的现代社会,让我窥探到了许许多多的杰出角色,他们偷取家庭时间去换取自己的功成名就,他们的心随着公司的企划案四处流浪,孩…

关于openstack 专业博主地址.后续更新

首先官方文档要放的https://docs.openstack.org/ 关于导入镜像方面说的很详细的.https://www.cnblogs.com/liawne/p/9322221.html 每天5分钟系列,有docker openstack等,而且还出书了.https://www.cnblogs.com/CloudMan6/p/5384923.html 转载于:https://www.cnblogs.com/lovesKe…

Java第一章java语言的概述

一、java语言的概述: 1.1dos命令 常用的dos命令: dir:列出当前目录下的文件以及文件夹 md:创建目录 rd:删除目录 cd:进入指定目录 cd..:退回到上一级目录 cd\:退回到根目录 del&…

【Quartz】深入Job、JobDetail、JobDataMap、Trigger

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 Quartz API核心接口有: Scheduler – 与scheduler交互的主要API;Job – 你通过scheduler执行任务,你…

Apache Accumulo 1.9.3 发布,高性能 K/V 存储方案

Apache Accumulo 1.9.3 发布了,Apache Accumulo 是一个可靠的、可伸缩的、高性能的排序分布式的 Key-Value 存储解决方案,基于单元访问控制以及可定制的服务器端处理。使用 Google BigTable 设计思路,基于 Apache Hadoop、Zookeeper 和 Thrif…

图形界面上机作业

1、 制作一个如图所示的界面(使用FlowLayout布局),不要求实现功能。 2、设计一个用标签、文本行与按钮来登录的界面(用GridLayout布局方式)。如图所示。 转载于:https://www.cnblogs.com/quan-2723365710/p/10881691.h…

【Quartz】Spring3.2.9 + Quqrtz2.2.1 实现定时实例

一、工程创建 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1、新建一个工程,导入相应的包Spring3.2.9Quqrtz2.2.1commons-logging 集成起来比较简单,对线程无需任何理解&a…

第七次发博不知道用什么标题好

一、this关键字,想起之前总是搞不懂this.name是where.name,嗯!第二个name就是形参name,所以这句话就是讲形参name的值传给成员变量name private void setName(String name ){ this.namename; } 二、构造方法:1.没有返回值 2.名称要与本类名称相同&#x…

Django框架之Filters(过滤器)、母版的使用

在Django的模板语言中,通过使用 过滤器 来改变变量的显示。 过滤器的语法: {{ value|filter_name:参数 }} 使用管道符"|"来应用过滤器。 注意事项: 过滤器支持“链式”操作。即一个过滤器的输出作为另一个过滤器的输入。过滤器可以…

不花钱就补足营养的8妙招

如今,人们越来越注重保健,为了补充营养,一些人不惜花重金买各种名贵保健品食用。其实,人体所需要的很多营养素就在我们身边,它们既不昂贵,也不稀缺,只需我们信手拈来。 叶酸 每人每日应补充…

PostgreSQL 自定义复合类型(composite type) deform引入的额外开销

标签 PostgreSQL , UDT , 自定义类型 背景 PG 允许用户自定义复合类型,自定义复合类型由多个类型组成,使用时会引入一些deform的开销。 例子 postgres# create unlogged table t(id int, c1 tp1, c2 int); CREATE TABLE postgres# insert into t sele…

第十二周作业

这个作业属于那个课程c语言这个作业要求在哪里https://edu.cnblogs.com/campus/zswxy/computer-scienceclass4-2018/homework/3236我在这个课程的目标是学习掌握单向链表,掌握二级指针的概念,以及指针数组这个作业在哪个具体方面帮助我实现目标前面3道题…

职场上的「小人」教我的事

很多人的小指头都会带一个尾戒,不是白金就是黄金,大部份是简单的一环,没有太多装饰,也很少镶宝石,目的不在于当作饰品,而是保命之用。 也有人不习惯戴尾戒,而是把指甲留得长长的,长到…

【Quartz】插件的使用

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 Quartz 框架提供了几种用于扩展平台能力的方式。通过使用各种 "钩子" (通常指的就是扩展点),Quartz 变得很容易被扩…

自动化运维平台(前端vue)

前端的大体流程:首先是Login登录组件,当输入用户名和密码之后,发送post请求到后端,然后根据返回的数据的是否正常,如果正常,将返回的token以及用户名保存到sessionStorage中,并使用导航守卫进行…

老程序员的下场

长期从事编程活动的程序员都期望在50多岁时能爬到一个足够高的职位,或者能顺利的退休。 但我在这里讨论的可能是一个你还没有想过的问题:如果到那时你失业了呢? 50多岁时你的职业仕途会成为一个问题。如果你有很好的技术,有人雇…

Quartz 之入门示例

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 环境:XPMyeclipse6.5JDK1.6 quartz官网:http://www.quartz-scheduler.org/ 参考资料 1 Quartz任务调度快速入门 http://www.blogjava…

CSS3最颠覆性的动画效果,基本属性[3D]

和2D一样也是transform 即变形 1)rotateX rotateY rotateZ(也可以用transform-origin来设置旋转中心点) 2)透视(perspective) 给父亲加透视,透视就是模拟眼睛到物体的距离,近大远小,即数值越小,3D越明显 理…

解决报错 :A component required a bean of type ‘gentle.test.Show‘ that could not be found

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. 启动工程失败,报错如题: A component required a bean of type gentle.test.Show that could not be found.…