JavaEE进阶知识学习-----定时任务调度Quartz-1-Quartz的HelloWord

概要

Quartz是一款强大的开源任务调度框架。主要用到了Builder模式,factory模式,组件模式和链式写法。包括了三个核心概念,分别是调度器,任务和触发器。

重要组成部分

Job:实现任务逻辑的任务接口。
JobDetail:JobDetail为Job实例提供了许多设置属性,以及JobDataMap成员变量属性,它用来存储特定Job实例的状态信息,调度器需要借助JobDetail对象来添加Job实例。重要的属性如下:name、group、jobClass、jobDataMap。

JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
                .withIdentity("myJob", "ground1").build();
System.out.println("jobDetail name:"+jobDetail.getKey().getName());// myJob
System.out.println("jobDetail group:"+jobDetail.getKey().getGroup());//  ground1
System.out.println("jobDetail jobClass:"+jobDetail.getJobClass().getName());// com.study.quartz.HelloJob

JobBuilder
JobStore
Trigger
TriggerBuilder
ThreadPool
Scheduler
calendar:一个Trigger可以和多个Calendar关联,以排除或包含某些时间点。
监听器:JobListener,TriggerListener,ScheduerListener

Quartz的Hello Word

1.创建一个maven工程,并引入Quartz的相关jar

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.0</version>
</dependency>

2.创建一个job类

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

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

public class HelloJob implements Job{

    @Override
    public void execute(JobExecutionContext arg0) throws JobExecutionException {
        //打印当前的执行时间
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("当前时间为:"+sf.format(date));
        //编写具体的业务逻辑
        System.out.println("Hello World");
    }

}

3.创建一个Scheduler类

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

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class HelloScheduler {
    public static void main(String[] args) throws SchedulerException {
        // 创建一个JobDetail实例,将实例与HelloJob绑定
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
                .withIdentity("myJob", "ground1").build();
        // 创建一个Trigger实例,定义该Job立即执行,并且每隔两秒钟重复执行一次
        Trigger trigger = TriggerBuilder
                .newTrigger()
                .withIdentity("myTrigger", "group1")
                .startNow()
                .withSchedule(
                        SimpleScheduleBuilder.simpleSchedule()
                                .withIntervalInSeconds(2).repeatForever())
                .build();
        //创建Schedule实例
        SchedulerFactory sFactory = new StdSchedulerFactory();
        Scheduler scheduler = sFactory.getScheduler();
        scheduler.start();
        //打印当前时间
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("当前时间为:"+sf.format(date));
        scheduler.scheduleJob(jobDetail,trigger);
    }

}

Job中的JobExecutionContext

  • 当Scheduler调用一个job,就会将JobExecutionContext传递给Job的execute方法。
  • Job可以通过JobExecutionContext对象访问到Quartz运行时候的环境以及Job本身的明细数据。

JobDataMap

  • 在进行任务调度时JobDataMap存储在JobExecutionContext中,方便获取。
  • JobDataMap可以用来装载任何可序列化的数据对象,当job实例对象被执行时这些参数对象就会传递给他。
  • JobDataMap实现了JDK的Map接口,并且添加了一些方便的方法用来存取基本的数据类型。

JobDataMap的获取方式

我们修改了HelloScheduler类,并传入了一些我们自定义的参数和值,如何在job中获取这些值,就使用到了JobDataMap对象。

public class HelloScheduler {
    public static void main(String[] args) throws SchedulerException {
        // 创建一个JobDetail实例,将实例与HelloJob绑定
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
                .withIdentity("myJob", "ground1")
                .usingJobData("message", "Hello job")
                .usingJobData("doubleJobValue", 66.6).build();
        
        // 创建一个Trigger实例,定义该Job立即执行,并且每隔两秒钟重复执行一次
        Trigger trigger = TriggerBuilder
                .newTrigger()
                .withIdentity("myTrigger", "group1")
                .usingJobData("message", "Hello trigger")
                .usingJobData("doubleTrigglerValue", 88.8)
                .startNow()
                .withSchedule(
                        SimpleScheduleBuilder.simpleSchedule()
                                .withIntervalInSeconds(2).repeatForever())
                .build();
        //创建Schedule实例
        SchedulerFactory sFactory = new StdSchedulerFactory();
        Scheduler scheduler = sFactory.getScheduler();
        scheduler.start();
        //打印当前时间
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("当前时间为:"+sf.format(date));
        scheduler.scheduleJob(jobDetail,trigger);
    }

}

Job类中JobDataMap的获取方式如下,包含了如何获取trigger中的自定义的参数值。

public class HelloJob implements Job{

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        //打印当前的执行时间
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("当前时间为:"+sf.format(date));
        //编写具体的业务逻辑
        JobKey key = context.getJobDetail().getKey();
        System.out.println("Job的name属性值和group属性值分别为:"+key.getName()+":"+key.getGroup());
        TriggerKey trKey = context.getTrigger().getKey();
        System.out.println("Trigger的name属性值和group属性值分别为:"+trKey.getName()+":"+trKey.getGroup());
        JobDataMap dataMap = context.getJobDetail().getJobDataMap();
        JobDataMap tDataMap = context.getTrigger().getJobDataMap();
        
        String jobMsg = dataMap.getString("message");
        double doubleJobValue = dataMap.getDouble("doubleJobValue");
        String tiggerMsg = tDataMap.getString("message");
        double doubleTrigglerValue = tDataMap.getDouble("doubleTrigglerValue");
        System.out.println("jobMsg:"+jobMsg);
        System.out.println("doubleJobValue:"+doubleJobValue);
        System.out.println("tiggerMsg:"+tiggerMsg);
        System.out.println("doubleTrigglerValue:"+doubleTrigglerValue);
        
    }

}

输出结果为:

当前时间为:2018-01-22 17:03:29
Job的name属性值和group属性值分别为:myJob:ground1
Trigger的name属性值和group属性值分别为:myTrigger:group1
jobMsg:Hello job
doubleJobValue:66.6
tiggerMsg:Hello trigger
doubleTrigglerValue:88.8

也可以使用成员变量的getter和setter获取

修改job类的代码如下

public class HelloJob implements Job{
    private String message;
    private double doubleJobValue;
    private double doubleTrigglerValue;
    
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public double getDoubleJobValue() {
        return doubleJobValue;
    }

    public void setDoubleJobValue(double doubleJobValue) {
        this.doubleJobValue = doubleJobValue;
    }

    public double getDoubleTrigglerValue() {
        return doubleTrigglerValue;
    }

    public void setDoubleTrigglerValue(double doubleTrigglerValue) {
        this.doubleTrigglerValue = doubleTrigglerValue;
    }

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        //打印当前的执行时间
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("当前时间为:"+sf.format(date));
        //编写具体的业务逻辑
        JobKey key = context.getJobDetail().getKey();
        System.out.println("Job的name属性值和group属性值分别为:"+key.getName()+":"+key.getGroup());
        TriggerKey trKey = context.getTrigger().getKey();
        System.out.println("Trigger的name属性值和group属性值分别为:"+trKey.getName()+":"+trKey.getGroup());
        
        System.out.println("Msg:"+message);
        System.out.println("doubleJobValue:"+doubleJobValue);
        
        System.out.println("doubleTrigglerValue:"+doubleTrigglerValue);
        
    }

}

结果为

Job的name属性值和group属性值分别为:myJob:ground1
Trigger的name属性值和group属性值分别为:myTrigger:group1
Msg:Hello trigger
doubleJobValue:66.6
doubleTrigglerValue:88.8

未完,待续

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概述 了解Quartz体系结构 Quartz对任务调度的领域问题进行了高度的抽象,提出了调度器、任务和触发器这3个...
    张晨辉Allen阅读 6,637评论 2 11
  • scheduler定时调度系统是大多行业项目都需要的,传统的spring-job模式,个人感觉已经out了,因为存...
    安琪拉_4b7e阅读 7,856评论 4 6
  • 我喜欢 听天籁声 比如鸟叫蛙鸣 雨落风吟 骨子里 乐于祥和宁静 人多时 能微笑便不说话 除非遇上知音 若刚好碰上聒...
    雪莉诗话阅读 3,529评论 8 22
  • 霸着电视不让看,三生三世桃花烂。孩妈还在装少女,脂粉爷们痴情汉。神仙闲的没事干,法力全用那上面。天上地下来回蹿,时...
    狙击手_ee4e阅读 1,603评论 0 1
  • 人这一生有许多无奈,许多痛苦,许多焦虑和泪水,更有很多的爱,很多的欢乐和美好。 我们,又一直在等待,等待着什么呢?
    阳光下泡脚丫阅读 1,193评论 0 0

友情链接更多精彩内容