ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

QuarZ笔记

2022-02-20 01:02:34  阅读:168  来源: 互联网

标签:Quartz job 任务 笔记 Job 实例 执行 QuarZ


Quartz任务调度

一.Quartz概念

Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。

quartz是开源且具有丰富特性的"任务调度库",能够集成于任何的java应用,小到独立的应用,大至电子商业系统。quartz能够创建亦简单亦复杂的调度,以执行上十、上百,甚至上万的任务。任务job被定义为标准的java组件,能够执行任何你想要实现的功能。quartz调度框架包含许多企业级的特性,如JTA事务、集群的支持。

简而言之,quartz就是基于java实现的任务调度框架,用于执行你想要执行的任何任务。

 

官网:

http://www.quartz-scheduler.org/

二.Quartz运行环境

- Quartz 可以运行嵌入在另一个独立式应用程序

- Quartz 可以在应用程序服务器(或servlet容器)内被实例化,并且参与事务

- Quartz 可以作为一个独立的程序运行(其自己的Java虚拟机内),可以通过RMI使用

- Quartz 可以被实例化,作为独立的项目集群(负载平衡和故障转移功能),用于作业的执行

 

 三.Quartz设计模式

- Builder模式

- Factory模式

- 组件模式

- 链式编程

 

四.Quartz学习的核心概念

 - 任务Job

    Job就是你想要实现的任务类,每一个Job必须实现org.quartz.job接口,且只需实现接口定义的execute()方法。

 - 触发器Trigger

    Trigger为你执行任务的触发器,比如你想每天定时3点发送一份统计邮件,Trigger将会设置3点进行执行该任务。Trigger主要包含两种SimpleTrigger和CronTrigger两种。关于二者的区别的使用场景,后续的课程会进行讨论。

 - 调度器Scheduler

    Scheduler为任务的调度器,它会将任务job及触发器Trigger整合起来,负责基于Trigger设定的时间来执行Job。

五.Quartz的体系结构

 

 

 

六.Quartz的几个常用API

以下是Quartz编程API几个重要接口,也是Quartz的重要组件

- Scheduler 用于与调度程序交互的主程序接口。

  Scheduler 调度程序-任务执行计划表,只有安排进执行计划的任务Job(通过scheduler.scheduleJob方法安排进执行计划),当它预先定义的执行时间到了的时候(任务触发trigger),该任务才会执行。

- Job 我们预先定义的希望在未来时间能被调度程序执行的任务类,我们可以自定义。

- JobDetail 使用JobDetail来定义定时任务的实例,JobDetail实例是通过JobBuilder类创建的。

- JobDataMap 可以包含不限量的(序列化的)数据对象,在job实例执行的时候,可以使用

  其中的数据;JobDataMap是Java Map接口的一个实现,额外增加了一些便于存取基本类型的数

  据的方法。

- Trigger 触发器,Trigger对象是用来触发执行Job的。当调度一个job时,我们实例一个触发器然后调整它的属性来满足job执行的条件。表明任务在什么时候会执行。定义了一个已经被安排的任务将会在什么时候执行的时间条件,比如每2秒就执行一次。

- JobBuilder -用于声明一个任务实例,也可以定义关于该任务的详情比如任务名、组名等,这个声明的实例将会作为一个实际执行的任务。

- TriggerBuilder 触发器创建器,用于创建触发器trigger实例。

- JobListener、TriggerListener、SchedulerListener监听器,用于对组件的监听。

 

七.Quartz的使用

1.准备工作

引入Quartz的jar包

1   <dependencies>
2      <dependency>
3      <groupId>org.quartz-scheduler</groupId>
4      <artifactId>quartz</artifactId>
5      <version>2.3.0</version>
6      </dependency>

2.入门案例

(1)创建HelloJob任务类

   

 1  public class HelloJob implements Job {
 2     
 3         @Override
 4         public void execute(JobExecutionContext arg0) throws JobExecutionException {
 5             // 定义时间
 6             Date date = new Date();
 7             SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 8             String dateString = dateFormat.format(date);
 9             // 定义工作任务内容
10             System.out.println("进行数据库备份操作。当前任务执行的时间:"+dateString);
11         }
12     }

(2)创建任务调度类HelloSchedulerDemo---完成任务调度需要三要素:调度器(Scheduler)、任务实列(JobDetail)、触发器( Trigger)

 

 

 

 1 HelloSchedulerDemo.java
 2 
 3     public class HelloSchedulerDemo {
 4 
 5         public static void main(String[] args) throws Exception {
 6             // 1.调度器(Scheduler)--从工厂中获取任务调度的实例
 7             Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
 8     
 9             // 2.任务实列(JobDetail)--定义一个任务调度实例,将该实例与HelloJob绑定,任务类需要实现Job接口
10             JobDetail job = JobBuilder.newJob(HelloJob.class)
11                     .withIdentity("job1", "group1") // 定义该实例唯一标识
12                     .build();
13     
14             // 3.定义触发器( Trigger) ,马上执行, 然后每5秒重复执行一次
15             Trigger trigger = TriggerBuilder.newTrigger()
16                     .withIdentity("trigger1", "group1") // 定义该实例唯一标识
17                     .startNow()  // 马上执行
18                     .withSchedule(SimpleScheduleBuilder.simpleSchedule()
19             .repeatSecondlyForever(5)) // 每5秒执行一次   
20                     .build();
21     
22             // 4:使用触发器调度任务的执行
23             scheduler.scheduleJob(job, trigger);
24     
25             // 5:开启
26             scheduler.start();
27             // 关闭
28             // scheduler.shutdown();
29         }
30     }

(3)实现效果

 

 

4.Job和JobDetail介绍

 

- Job:工作任务调度的接口,任务类需要实现该接口。该接口中定义execute方法,类似JDK提供的TimeTask类的run方法。在里面编写任务执行的业务逻辑。

- Job实例在Quartz中的生命周期:每次调度器执行Job时,它在调用execute方法前会创建一个新的Job实例,当调用完成后,关联的Job对象实例会被释放,释放的实例会被垃圾回收机制回收。

- JobDetail:JobDetail为Job实例提供了许多设置属性,以及JobDetaMap成员变量属性,它用来存储特定Job实例的状态信息,调度器需要借助JobDetail对象来添加Job实例。

- JobDetail重要属性:name、group、jobClass、jobDataMap

 

1         JobDetail job = JobBuilder.newJob(HelloJob.class)
2                 .withIdentity("job1", "group1") // 定义该实例唯一标识,并指定一个组。
3                 .build();
4 
5         System.out.println("name:"+job.getKey().getName());
7         System.out.println("group:"+job.getKey().getGroup());
9         System.out.println("jobClass:"+job.getJobClass().getName());

5.JobExecutionContext介绍

- 当Scheduler调用一个Job,就会将JobExecutionContext传递给Job的execute()方法;

- Job能通过JobExecutionContext对象访问到Quartz运行时候的环境以及Job本身的明细数据。

 

 

 

 

6.JobDataMap介绍

 

(1)使用Map获取。

 

- 在进行任务调度时,JobDataMap存储在JobExecutionContext中 ,非常方便获取。

 

- JobDataMap可以用来装载任何可序列化的数据对象,当job实例对象被执行时这些参数对象会传递给它。

 

 

 

- JobDataMap实现了JDK的Map接口,并且添加了非常方便的方法用来存取基本数据类型。

 

标签:Quartz,job,任务,笔记,Job,实例,执行,QuarZ
来源: https://www.cnblogs.com/tttong/p/15914357.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有