quartz定时任务基础概念及使用

简介

Quartz是一个完全由Java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制。Quartz允许开发人员根据时间间隔来调度作业,它实现了作业触发器的多对多的关系,还能把多个作业与不同的触发器关联 Quartz-1.x与Quartz-2.x在使用上差别较大 这里介绍2.x版本

核心概念

架构图

核心接口及类

  1. Job :任务 它是一个接口,只有一个方法
    void execute(JobExecutionContext context)
    开发者实现该接口来定义自己的任务 ,其中JobExecutionContext类提供了调度上下文的各种信息,Job运行时的信息保存在JobDataMap实例中
  2. JobDetail:Quartz在每次执行Job时,接受一个Job实现类,JobDetail 描述了Job实现类及其它相关的静态信息,如Job名字、描述、关联监听器等信息
  3. Trigger:是一个类,它描述了触发Job执行的时间规则,简单说就是设置作业执行的时间、参数、条件等,主要有SimpleTrigger和CronTrigger这两个子类。CronTrigger支持Cron表达式,可以定义出复杂的时间规则
  4. Calendar:org.quartz.Calendar和java.util.Calendar不同,它是一些日历特定时间点的集合,一个Trigger可以和多个Calendar关联,以便排除或包含某些时间点。
  5. Scheduler:调度器 代表一个Quartz的独立运行容器,负责调度作业和触发器,JobDetail和Trigger可以注册在Scheduler中,拥有各自唯一的组及名称,组及名称是Scheduler查找定位容器中某一对象的依据
  6. ThreadPool:Scheduler使用一个线程池作为任务运行的基础设施,任务通过共享线程池中的线程提高运行效率。

关系

Scheduler把Trigger绑定到某一个JobDetail上,这样当Trigger触发时对应的Job就会执行。一个Job可以对应多个Trigger,但一个Trigger只能对应一个Job。可以通过SchedulerFactory创建一个Scheduler,Scheduler里有一个SchedulerContext,它保存着Scheduler上下文件信息,类似与ServletContext,Job和Trigger都可以访问它。SchedulerContext内部有一个Map,以键值对的形式维护着上下文件信息,可以通过Scheduler.getContext()获取SchedulerContext对象

单独使用

  1. 官网下载quartz包,将核心依赖quartz-x.x.x.jar以及相关jar包导入工程中

    如果是Maven项目 引入依赖jar包
    <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.3</version> </dependency>

  2. 编写job类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    package top.lilixin;
    import org.quartz.Job;
    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;
    import java.util.Date;
    /**
    * Created by lilixin on 03/08/2017.
    */
    public class MyJob implements Job{
    public void execute(JobExecutionContext context) throws JobExecutionException {
    System.out.println("my job is running ,time="+new Date());
    }
    }
  3. 编写调度器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    package top.lilixin;
    import org.quartz.*;
    import org.quartz.impl.StdSchedulerFactory;
    /**
    * created by lilixin
    */
    public class MyTask
    {
    public static void main( String[] args ){
    //通过SchedulerFactory 获取调度器 scheduler
    SchedulerFactory factory = new StdSchedulerFactory();
    try {
    Scheduler scheduler = factory.getScheduler();
    //引进作业程序
    JobBuilder jobBuilder = JobBuilder.newJob();
    JobDetail jobDetail = jobBuilder.newJob(MyJob.class).withIdentity("job1","group1").build();
    //新建一个时间
    Trigger trigger = TriggerBuilder
    .newTrigger()
    .withIdentity("trigger1","group1")
    .startNow()
    .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever())
    .build();
    //作业和触发器设置到调度器里
    scheduler.scheduleJob(jobDetail,trigger);
    //启动调度器
    scheduler.start();
    } catch (SchedulerException e) {
    e.printStackTrace();
    }
    }
    }

与spring集成使用

关注我的微信,共同分享与讨论!