Quartz(01) Quartz快速入门

x33g5p2x  于2021-12-21 转载在 其他  
字(4.1k)|赞(0)|评价(0)|浏览(398)

在做项目的时候,有时候会用到定时任务.虽然Java自身提供了定时任务的功能,但是在实际的项目开发中,一般都会使用到Quartz这个框架. Quartz 在开源任务调度框架中的首屈一指.不仅是因为其提供了强大的调度机制,而且使用起来也特别简洁.当然Spring 也集成了Quartz,这位我们的开发带来了很大的方便.
   网上有很多关于Quartz 的文章,进过一段时间的学习和工作中项目的实战,总结了这个系列的文章.
   阅读前须知: 1. Quartz1 和Quartz2有比较大的区别,本系列是采用的是此时最新的版本 quartz2.2.3 ;2.在后后期的文章中做了 spring3.2.9+quartz2.2.3 的整合 3.本系列文章中所有的项目都是经过测试的,而且源码可下载. 源码下载地址 4.在学习的过程中,参考了《Quartz Job Scheduling Framework》,这本书讲的很详细,但遗憾的是没有讲解与Spring 的整合,与Spring的整合参考了Spring的文档

1 几个核心的概念(重要的有标记)
  Job:是一个接口,只有一个方法void execute(JobExecutionContext context),开发者实现该接口定义运行任务,JobExecutionContext类提供了调度上下文的各种信息。Job运行时的信息保存在JobDataMap实例中;()
  JobDetail:Quartz在每次执行Job时,都重新创建一个Job实例,所以它不直接接受一个Job的实例,相反它接收一个Job实现类,以便运行时通过newInstance()的反射机制实例化Job。因此需要通过一个类来描述Job的实现类及其它相关的静态信息,如Job名字、描述、关联监听器等信息,JobDetail承担了这一角色。通过该类的构造函数可以更具体地了解它的功用:JobDetail(java.lang.String name, java.lang.String group, java.lang.Class jobClass),该构造函数要求指定Job的实现类,以及任务在Scheduler中的组名和Job名称;(
)
   Trigger:是一个类,描述触发Job执行的时间触发规则。主要有SimpleTrigger和CronTrigger(常用且重要)这两个子类。当仅需触发一次或者以固定时间间隔周期执行,SimpleTrigger是最适合的选择;而CronTrigger则可以通过Cron表达式定义出各种复杂时间规则的调度方案:如每早晨9:00执行,周一、周三、周五下午5:00执行等;(*)

Scheduler:代表一个Quartz的独立运行容器,Trigger和JobDetail可以注册到Scheduler中,两者在Scheduler中拥有各自的组及名称,组及名称是Scheduler查找定位容器中某一对象的依据,Trigger的组及名称必须唯一,JobDetail的组和名称也必须唯一(但可以和Trigger的组和名称相同,因为它们是不同类型的)。Scheduler定义了多个接口方法,允许外部通过组及名称访问和控制容器中Trigger和JobDetail。Scheduler可以将Trigger绑定到某一JobDetail中,这样当Trigger触发时,对应的Job就被执行。一个Job可以对应多个Trigger,但一个Trigger只能对应一个Job。可以通过SchedulerFactory创建一个Scheduler实例。Scheduler拥有一个SchedulerContext,它类似于ServletContext,保存着Scheduler上下文信息,Job和Trigger都可以访问SchedulerContext内的信息。SchedulerContext内部通过一个Map,以键值对的方式维护这些上下文数据,SchedulerContext为保存和获取数据提供了多个put()和getXxx()的方法。可以通过Scheduler# getContext()获取对应的SchedulerContext实例;(*)

概念总是枯燥的.要想理解上面几个核心概念,通过具体的例子是一个很好的办法.
1.创建一个项目,可以普通的项目,也可以是web项目,这里我创建了web项目. 包含如下jar包.

2.创建一个实现了org.quartz.Job 接口的类

package com.quartz.job;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

//实现了job接口的Q1 job
public class Q1 implements Job {

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("------------------------");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd hh:mm:ss");
        System.out.println(sdf.format(new Date()));
        // 获取jobDetail 中的参数
        JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
        String para1 = jobDataMap.getString("para1");
        System.out.println("jobDataMap中的para1:" + para1);
        System.out.println("------------------------");
    }

}

3.创建调度

package com.quartz.test;

import org.apache.log4j.Logger;
import org.quartz.JobBuilder;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

import com.quartz.job.Q1;

public class SimpleScheduler {
    Logger logger = Logger.getLogger(SimpleScheduler.class);

    public void startScheduler() {
        try {
            // 创建Q1的一个jobDetail,传入Q1.class;job_1(任务名),jGroup1(任务组)
            JobDetail jobDetail = JobBuilder.newJob(Q1.class).withIdentity("job_1", "jGroup1").build();

            // 可以向jobDetail 中设置参数,这些参数在Q1的execute方法中获取到
            JobDataMap jobDataMap = jobDetail.getJobDataMap();
            jobDataMap.put("para1", "hello,Quartz!");

            // 5秒执行一次trogger_1(触发器名) ,tGroup1(触发器组名)
            SimpleScheduleBuilder builder = SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5)
                    .repeatForever();
            Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trogger_1", "tGroup1").startNow()
                    .withSchedule(builder).build();

            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            // scheduler 装载jobDetail 和 trigger
            scheduler.scheduleJob(jobDetail, trigger);
            // 启动 scheduler
            scheduler.start();
        } catch (SchedulerException e) {
            logger.error(e);
        }
    }

    public static void main(String[] args) {
        SimpleScheduler ss = new SimpleScheduler();
        ss.startScheduler();
    }

}

一个简单的定时任务就完成了.运行结果:

本文介绍一下Quartz的几个核心概念,并创建了第一个的Quartz 入门项目.下一章我们来学习JobDetail 和两种不同的Trigger.
下一章节地址Quartz(02) 两种Trigger(SimpleTrigger/CronTrigger)

相关文章