我是靠谱客的博主 平常蜻蜓,最近开发中收集的这篇文章主要介绍Quartz技术,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述


title: Quartz技术(一)-Quartz简介和简单实现
categories:

  • 后端
    tags:
  • 定时任务

本文将主要介绍Quartz的相关技术,全文都将基于Springboot做代码实现。

Quartz简介

Quartz是一个开源的作业调度框架,可以让计划的程序任务一个预定义的日期和时间运行。Quartz可以用来创建简单或复杂的日程安排执行几十,几百,甚至是十万的作业数。

Quartz核心概念

Quartz API

  • Scheduler - 与调度程序交互的主要API(即:调度器)。
  • Job - 由希望由调度程序执行的组件实现的接口(即:需要被调度执行的任务)。
  • JobDetail - 用于定义作业的实例(即:具体需要被调度任务的封装对象)。
  • Trigger(即触发器) - 定义执行给定作业的计划的组件。
  • JobBuilder - 用于定义/构建JobDetail实例,用于定义作业的实例。
  • TriggerBuilder - 用于定义/构建触发器实例。

Quartz生命周期

Scheduler的生命期,从SchedulerFactory创建它时开始,到Scheduler调用shutdown()方法时结束;Scheduler被创建后,可以增加、删除和列举Job和Trigger,以及执行其它与调度相关的操作(如暂停Trigger)。但是,Scheduler只有在调用start()方法后,才会真正地触发trigger(即执行job)

Quartz简单实例

POM依赖

<!--Quartz依赖-->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>

属性文件

Quartz的配置通常通过使用属性文件(使用StdSchedulerFactory(消耗配置文件并实例化调度程序))来完成。

默认情况下,StdSchedulerFactory从“当前工作目录”加载名为“quartz.properties”的属性文件。如果失败,则加载org / quartz包中(作为资源)的“quartz.properties”文件。如果您希望使用除这些默认值之外的文件,则必须定义系统属性“org.quartz.properties”以指向所需的文件。

或者,您可以在调用StdSchedulerFactory之前调用getScheduler()时,通过调用其中一个initialize(xx)方法来显式初始化工厂。

quartz.properties主要配置

  1. 主配置(配置主调度器设置,事务处理)
  2. ThreadPool的配置(调整作业执行的资源)
  3. 侦听器的配置(您的应用程序可以接收预定事件的通知)
  4. 插件配置(为您的调度程序添加功能)
  5. RMI服务器和客户端的配置(从远程进程使用Quartz实例)
  6. RAMJobStore的配置(存储作业和触发器)
  7. JDBC-JobStoreTX的配置(通过JDBC在数据库中存储作业和触发器)
  8. JDBC-JobStoreCMT(具有JTA容器管理事务的JDBC)的配置
  9. DataSources的配置(供JDBC-JobStores使用)
  10. 数据库集群的配置(使用JDBC-JobStore实现故障切换和负载平衡)
  11. TerracottaJobStore的配置(无数据库的集群)

为了实用quartz,一个基础的配置文件要包含以下内容

org.quartz.scheduler.instanceName = MyScheduler
org.quartz.threadPool.threadCount = 3
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

由此配置创建的scheduler具有以下特征:

org.quartz.scheduler.instanceName - 此调度程序的名称将为“MyScheduler”。
org.quartz.threadPool.threadCount - 线程池中有3个线程,这意味着最多可以同时运行3个job。
org.quartz.jobStore.class quartz的所有数据,包括job和trigger的配置,都会存储在内存中(而不是数据库里)。如果你想使用quartz的数据库存储功能(校对注:设置成另外一个类),数据库存储和使用内存存储(RamJobStore)后续会讲解。

启动实例

import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;
import static org.quartz.JobBuilder.*;
import static org.quartz.TriggerBuilder.*;
import static org.quartz.SimpleScheduleBuilder.*;
public class QuartzTest {
public static void main(String[] args) {
try {
// Grab the Scheduler instance from the Factory
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
// and start it off
scheduler.start();
scheduler.shutdown();
} catch (SchedulerException se) {
se.printStackTrace();
}
}
}

当你调用StdSchedulerFactory.getDefaultScheduler()获取scheduler实例对象后,在调用scheduler.shutdown()之前,scheduler不会终止,因为还有活跃的线程在执行。

实例化一个Scheduler,并调用一个Job

SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
Scheduler sched = schedFact.getScheduler();
sched.start();
// define the job and tie it to our HelloJob class
JobDetail job = newJob(HelloJob.class)
.withIdentity("myJob", "group1")
.build();
// Trigger the job to run now, and then every 40 seconds
Trigger trigger = newTrigger()
.withIdentity("myTrigger", "group1")
.startNow()
.withSchedule(simpleSchedule()
.withIntervalInSeconds(40)
.repeatForever())
.build();
// Tell quartz to schedule the job using our trigger
sched.scheduleJob(job, trigger);

最后

以上就是平常蜻蜓为你收集整理的Quartz技术的全部内容,希望文章能够帮你解决Quartz技术所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部