概述
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主要配置
- 主配置(配置主调度器设置,事务处理)
- ThreadPool的配置(调整作业执行的资源)
- 侦听器的配置(您的应用程序可以接收预定事件的通知)
- 插件配置(为您的调度程序添加功能)
- RMI服务器和客户端的配置(从远程进程使用Quartz实例)
- RAMJobStore的配置(存储作业和触发器)
- JDBC-JobStoreTX的配置(通过JDBC在数据库中存储作业和触发器)
- JDBC-JobStoreCMT(具有JTA容器管理事务的JDBC)的配置
- DataSources的配置(供JDBC-JobStores使用)
- 数据库集群的配置(使用JDBC-JobStore实现故障切换和负载平衡)
- 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技术所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复