【Quartz】定时任务小练习

定时任务最主要的三个核心

任务 Job

调度器 Scheduler

触发器 Trigger [Scheduler只有在调用start()方法后,才会真正地触发trigger(即执行job)]

Job:中包含了任务执行的逻辑,Scheduler负责扫描需要执行的Job任务,Tragger负责定时。

同样重要的几个成员

JobDetail :客户端创建(我们自己),绑定Job的实例信息。一个JobDetail可以有多个Trigger,但是一个Trigger只能对应一个JobDetail。

JobBuilder: 定义和创建JobDetail实例的接口

TriggerBuilder:定义和创建触发器Trigger实例

JobDataMap:可以包含不限量的(序列化的)数据对象,在job实例执行的时候,可以使用其中的数据;

 

Trigger 主要有四种类型 【一般最常用的是SimpleTrigger 和 CronTrigger】

SimpleTrigger :一般用于实现每隔一定时间执行任务,以及重复多少次,如每 60 秒执行一次,重复执行 6 次。

CronTrigger :使用Cron表达式来进行定时

DailyTimeIntervalTrigger:会在给定的时间区间内每隔 N(1, 2, 3...)秒或小时执行任务 

CalendarIntervalTrigger 一般用于处理基于日历时间重复间隔任务

执行流程:

scheduler.start()----》trigger被触发----》Job的excute被调用,通过返回给excute方法JobExecutionContext参数

 

JobExecutionContext中包含着

执行job的scheduler的引用

触发job的trigger的引用

JobDetail对象引用,以及一些其它信息。

 

下面实际操作一下

步骤一:建立一个Job的实现类 HelloJob

package com.quartz.quartz.test;


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

import java.util.Date;

/**
 * @Author EJiao
 * @Date 2019/3/28 11:28
 **/
public class HelloJob implements Job {


    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        JobDetail detail = jobExecutionContext.getJobDetail();
        String name = detail.getJobDataMap().getString("name");
        System.out.printf("========say hello to "+ name + "at ===>" + new Date());
    }
}

 

步骤二 建立 JobDetail 与Job实现类绑定(可在其中设置名称和分组名,

 //创建一个JobDetail,将该实例与HelloJob绑定
    public static JobDetail getJobDetail(){
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)//定义Job类为HelloJob类,这是真正的执行逻辑所在
                .withIdentity("myJob","group1")   //定义name/group
                .usingJobData("name","一哈哈")//定义属性
                .build();
        return jobDetail;
    }

 

步骤三创建指定的Trigger 【SimpleTrigger】

 //内部实现机制是通过计算间隔时间来计算下次的执行时间, misfired 的任务并且恢复执行时,会扰乱我们的预期执行时间
    public static Trigger getSimpleTrigger(int time,Date endTime){
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("name", "group1") //定义name/group
                .startAt(new Date())  //设置开始时间【注意,时间的设置要在任务调度设置之前】
                .endAt(endTime)   //设置结束时间
                .startNow()//一旦加入scheduler,立即生效
                .withSchedule(simpleSchedule() //使用SimpleTrigger
                 // .withIntervalInSeconds(time) //每隔一秒执行一次
                .repeatForever())//一直执行,奔腾到老不停歇
//               .withRepeatCount(3))  //重复执行3次(一共4次)
                .build();
        return trigger;
    }

 

【CronTrigger】

   public static Trigger getCronSchedule(){
        Trigger tigger = TriggerBuilder.newTrigger()
                .withIdentity("calendar","group1")
                .usingJobData("name","易嘻嘻")
                .withSchedule(CronScheduleBuilder.cronSchedule("*/2 * * * * ?")) //每隔2秒执行一次
                .build();
        return tigger;
    }

 

main测试一下

 

 public static void main(String[] args)  throws SchedulerException{
        //创建Schedule实例【方式1】
        Scheduler scheduler  = new StdSchedulerFactory().getScheduler();
        //创建Schedule实例【方式2】
        Scheduler scheduler2  = StdSchedulerFactory.getDefaultScheduler();
        Date endTime = new Date();
        endTime.setTime(endTime.getTime()+8000); //执行8秒后结束,(这里要设置重复执行不然只会执行一次)
//        scheduler.scheduleJob(getJobDetail(),getSimpleTrigger(1,endTime));
        scheduler.scheduleJob(getJobDetail(),getCronSchedule());
        scheduler.start();

    }

 

你可能感兴趣的:(JAVA)