Quartzd定时任务的简介和实现

个人博客:https://domyselfzy.github.io/

本文将主要介绍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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值