专栏首页别先生Quartz的简单使用。

Quartz的简单使用。

1、Java定时器任务调度工具Quartz(纯java编写,十分强大)。由OpenSymphony提供的强大开源任务调度框架。官方网址:http://www.quartz-scheduler.org

特点:a、强大的调度功能。b、灵活的应用方式。3、分布式和集群能力。 设计模式:a、Builder模式(JobDetail、Trigger)。b、Factory模式(调度器)。c、组件模式(可插拔哦,耦合度低)。d、链式写法(十分好使哦,超喜欢呢)。

2、Quartz的三个核心概念。 a、调度器(负责定期,定时,定频率的去执行调度任务)。 b、任务(就是自己开发的业务逻辑)。 c、触发器(就是时间,Trigger)。 3、Quartz的体系结构。 a、JobDetail(包含了任务的实现类以及类的信息)。 b、Trigger(就是触发器,决定了任务什么适合被调用)。Trigger分为两种,分别是SimpleTrigger和CronTrigger(功能更强大)。 c、Scheduler(调度器,定时,顶频率执行jobDetail)。有start方法、stop方法、pause方法、resume方法。等等方法。 4、Quartz的重要组成。 a、Job接口,只有一个方法execute(),此方法里面实现的就是自己的业务逻辑。JobExecutionContext参数可以进行调度上下文的各种信息。 b、JobDetail,Quartz在每次执行job的时候就会重新创建一个job实例,所以Quartz不节制直接接受一个job实例,相反,它接受一个job实现类,以便运行时通过new Instance()的反射机制实例化job,因此需要通过一个类来描述这个job实现类以及其他相关的静态信息,如job的名称,所在组,描述,关联监听器等等信息。 c、JobBuilder用户创建JobDetail实例。 d、JobStore,是一个接口。用来保存job数据的。 e、Trigger,是一个类,用来描述时间触发规则。 f、TriggerBuilder,用来定义或者创建触发器的实例的。 g、ThreadPool。线程池,Quartz有这个线程池在执行。 h、Scheduler调度器。代表Quartz独立运行的容器。可以将JobDetail和Trigger进行组合。其两者都有自己的名称和所在组。 i、 Calender,一个Trigger可以和多个Calendar关联,以排除或包含某些时间点。 j、监听器,jobListener,TriggerListener,SchedulerListener。


Quartz代码练习使用。

1、创建maven工程,然后引入Quartz的jar包。

 1 <project xmlns="http://maven.apache.org/POM/4.0.0"
 2     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 4     <modelVersion>4.0.0</modelVersion>
 5 
 6     <groupId>com.bie</groupId>
 7     <artifactId>HelloQuartz</artifactId>
 8     <version>0.0.1-SNAPSHOT</version>
 9     <packaging>jar</packaging>
10 
11     <name>HelloQuartz</name>
12     <url>http://maven.apache.org</url>
13 
14     <properties>
15         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
16     </properties>
17 
18     <dependencies>
19         <dependency>
20             <groupId>junit</groupId>
21             <artifactId>junit</artifactId>
22             <version>3.8.1</version>
23             <scope>test</scope>
24         </dependency>
25         <!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
26         <dependency>
27             <groupId>org.quartz-scheduler</groupId>
28             <artifactId>quartz</artifactId>
29             <version>2.2.1</version>
30         </dependency>
31     </dependencies>
32 </project>

2、然后创建一个HelloJob,实现Job接口,编写自己的业务逻辑。Job定义,实现业务逻辑的任务接口。

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

JobExecutionContext,当Scheduler调用一个job,就会将JobExecutionContext传递给job的execute()方法。job能通过JobExecutionContext对象访问到Quartz运行时候的环境以及job本身的明细数据。

 1 package com.bie.HelloQuartz;
 2 
 3 import java.text.SimpleDateFormat;
 4 import java.util.Date;
 5 
 6 import org.quartz.Job;
 7 import org.quartz.JobExecutionContext;
 8 import org.quartz.JobExecutionException;
 9 
10 /**
11  * 
12  * @Description TODO
13  * @author biehl
14  * @Date 2019年9月6日 上午11:55:09
15  * 
16  *       首先需要定义一个Quarta的job作业
17  */
18 public class HelloJob implements Job {
19 
20     /**
21      * 实现Job接口的类,需要实现job接口里面的方法。
22      * 
23      * execute方法是需要执行的业务逻辑。
24      */
25     public void execute(JobExecutionContext arg0) throws JobExecutionException {
26         // 打印当前的执行时间,格式为2019-09-06 00:00:00
27         Date date = new Date();
28         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
29         System.out.println("Current Exec Time is : " + sdf.format(date));
30         // 编写具体的业务逻辑。根据自己的需求进行修改即可。
31         System.out.println("hello world !!! Quartz");
32     }
33 
34 }

3、然后实现自己的调度器,首先JobDetail和自己的Job绑定,然后定义好时间Trigger,最后使用Scheduler调度器将JobDetail和Trigger结合到一起。

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

JobDataMap,在进行任务调度时JobDataMap存储在JobExecutionContext中,非常方便获取。JobDataMap可以用来装载任何可序列化的数据对象,当job实例对象被执行时这些参数对象会传递给它。JobDataMap实现了jdk的map接口,并且添加了一些非常方便的方法用来存取基本数据类型。

Trigger中是Quartz中的触发器,用来告诉调度程序作业什么时候触发,即Trigger对象是用来触发执行job的。

 1 package com.bie.HelloQuartz;
 2 
 3 import java.text.SimpleDateFormat;
 4 import java.util.Date;
 5 
 6 import org.quartz.JobBuilder;
 7 import org.quartz.JobDetail;
 8 import org.quartz.Scheduler;
 9 import org.quartz.SchedulerException;
10 import org.quartz.SchedulerFactory;
11 import org.quartz.SimpleScheduleBuilder;
12 import org.quartz.Trigger;
13 import org.quartz.TriggerBuilder;
14 import org.quartz.impl.StdSchedulerFactory;
15 
16 /**
17  * 
18  * @Description TODO
19  * @author biehl
20  * @Date 2019年9月6日 上午11:59:33
21  * 
22  *       测试Quartz的主类
23  *       1、定义自己的job,编辑的是自己的业务逻辑。
24  *       2、定义JobDetail,其中JobDetail用于来绑定自己的job作业。
25  *       3、定义Trigger。需要创建一个SimpleScheduleBuilder,这个用于定义执行的时间,是否重复等等时间要素。
26  *       4、定义Scheduler。通过工厂模式创建,用于绑定自己的jobDetail和trigger。
27  * 
28  */
29 public class HelloScheduler {
30     
31     public static void main(String[] args) {
32         // 创建一个JobDetail实例,将该实例与HelloJob Class进行绑定
33         JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("myJob1", "group1").build();
34         // 创建一个Trigger实例,该实例用于触发job去执行。什么适合执行,多长时间执行一次,是否重复执行。
35         SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2)
36                 .repeatForever();
37         Trigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1").startNow()
38                 .withSchedule(simpleScheduleBuilder).build();
39         // 创建schedule实例,工厂方法,创建schedule
40         SchedulerFactory schedulerFactory = new StdSchedulerFactory();
41         try {
42             Scheduler scheduler = schedulerFactory.getScheduler();
43             scheduler.start();
44             scheduler.scheduleJob(jobDetail, trigger);
45         } catch (SchedulerException e) {
46             // TODO Auto-generated catch block
47             e.printStackTrace();
48         }
49 
50         // 打印当前的时间,格式为2019-09-06 00:00:00
51         Date date = new Date();
52         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
53         System.out.println("Current Time is : " + sdf.format(date));
54     }
55 }

执行效果如下所示:

待续.......

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring Boot整合Scheduled定时任务器、整合Quartz定时任务框架

    首先说明一下,这里使用的是Springboot2.2.6.RELEASE版本,由于Springboot迭代很快,所以要注意版本问题。

    别先生
  • SpringBoot2.x|Thymeleaf页面不能正常载入css、js文件

    1、实现实现WebMvcConfig配置类可以解决页面不能加载css,js的问题;

    别先生
  • 一脸懵逼学习MapReduce的原理和编程(Map局部处理,Reduce汇总)和MapReduce几种运行方式

    1:MapReduce的概述:   (1):MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题.   (2):...

    别先生
  • Spring Job?Quartz?XXL-Job?年轻人才做选择,艿艿全莽~

    在产品的色彩斑斓的黑的需求中,有存在一类需求,是需要去定时执行的,此时就需要使用到定时任务。例如说,每分钟扫描超时支付的订单,每小时清理一次日志文件,每天统计前...

    芋道源码
  • quartz使用案例篇【面试+工作】

    作业是由其创建者赋予的名字,也可以组织成命名组。触发器也可以给予名称和放置在组中,以方便地将它们调度内组织。作业可以被添加到所述调度器一次,而是具有多个触发器注...

    奋斗蒙
  • Quartz学习

    Quartz学习 介绍Quartz Quartz是一个开源的任务调度系统,它能用来调度很多任务的执行。 运行环境 Quartz 能嵌入在其他应用程序里运行。 Q...

    汤高
  • 作业调度框架Quartz

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

    奋飛
  • python读取ppt文本内容

    py3study
  • Scrapy框架中crawlSpider的使用——爬取内容写进MySQL和拉勾网案例

    Scrapy框架中分两类爬虫,Spider类和CrawlSpider类。该案例采用的是CrawlSpider类实现爬虫进行全站抓取。

    菲宇
  • Python代码重构参考

    在数据库方向上相对来说能够容易推出开发规范和标准,但是你很少听到公司里面出针对开发同学的开发规范。我觉得其中的一个原因是程序猿比较执拗,以技术服人,经常...

    jeanron100

扫码关注云+社区

领取腾讯云代金券