quartz 定时任务的总结 trigger SimpleTrigger CronTrigger

Posted laosunlaiye

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了quartz 定时任务的总结 trigger SimpleTrigger CronTrigger相关的知识,希望对你有一定的参考价值。

 

看下图这三个的 关系:

技术分享图片

看清关系之后写代码分析:

MyScheduler 类:
package cn.org.test;

import cn.org.job.MyJob;
import cn.org.job.MyJob02;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

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

/**
 * Created with IntelliJ IDEA.
 * User: Jayden
 * Date: 2018/7/31
 * Time: 8:58
 */
public class MyScheduler {
    public static void main (String[] args){
        //下面的.usingJobData("message","job1使用的jobDetailmap") 就是给JobDataMap 里面添加key,value;
        //jobDetail trigger 都是bulider模式创建,通过.withIdentity("job01","group1") 方式设置 name, group,quartz的机制是一个job可以有多个trigger,但是一个trigger只能有一个job。

        JobDetail jobDetail = JobBuilder.newJob(MyJob.class).withIdentity("job01","group1").usingJobData("message","job1使用的jobDetailmap").build();
        JobDetail jobDetail1 = JobBuilder.newJob(MyJob02.class).withIdentity("job02","group02").usingJobData("message","job02使用的jobDetailmap").build();

        //设定时间戳 启动3秒后开始执行,时间间隔是每两秒执行一次
    /*  long currentTimeMillis = System.currentTimeMillis();
        SimpleDateFormat format = new SimpleDateFormat("yyyy- MM -dd HH:mm:ss");
        System.out.println("当前时间是:"+    format.format(new Date()));
        currentTimeMillis +=  3000;

        Date date = new Date(currentTimeMillis);
        SimpleDateFormat format1 = new SimpleDateFormat("yyyy- MM -dd HH:mm:ss");

        System.out.println("开始时间是:"+    format1.format(date));*/
       /* try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }*/
        /**
         * trigger 主要是触发器,设置在什么时间触发,以及触发次数,它的属性包含 JobKey,startTime,endTime,这些属性值都可以在job类里面通过JobExecutionContext context获取,
         * 常用的实现类SimpleTrigger 和CronTrigger,它的创建模式和JobDetail一样都是用builder模式;
         *
         */
        /*另一种方式设置时间戳 5秒后
        *  Date date =new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        date.setTime(date.getTime() + 5000);
        simpleDateFormat.format(date);
        *
        *
        * */
        Date date =new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        date.setTime(date.getTime() + 5000);
        simpleDateFormat.format(date);

        Date endDate = new Date();
        endDate.setTime(endDate.getTime()+10000);
        //SimpleTrigger的两种用法
        //1.这里设置的是五秒后执行一次。
        //SimpleTrigger simpleTrigger = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("simpleTrigger","simpleGroup").startAt(date).build();
        //2.下面这一行代码,意思是对于forJob(jobDetail)的job 创建在5秒后执行的任务,结束时间是当前时间的的10秒后,中间时间每2秒执行一次,这样算下来总共执行3次此任务。
      // SimpleTrigger  simpleTrigger = TriggerBuilder.newTrigger().forJob(jobDetail).withIdentity("simpleTrigger02","simpleGroup02").startAt(date).withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(2)).endAt(endDate).build();


        //CronTrigger 强大之处主要在于它的cron表达式,是一条字符串形式,它是基于Calendar日历来设置触发时间,cron表达式的格式  从左到右(用空格隔开):"秒 分 时 天 月 周 (年)",中间有空格,具体使用问度娘,这里举例几个,
        //1.2018年每天10点15分触发一次 0 15 10 ?* * 2018
        //2.每天的14点整至14点59分55秒,以及18点整至18点59分55秒, 每五分钟触发一次 0/5 0 14,18 * * ?
        //3.每月周一至周五的10点15分触发一次  0 15 10 ? * MON-FRI
        //4.每月最后一天的10点15分触发一次 0 15 10 L * ?
        //5.每月第三个周五的10点15分触发一次 0 15 10 ? * 6#3
        //下面创建的CronTrigger 对象,距离当前时间的5秒后开始,结束时间是当前时间的10秒后,这段时间其间,每隔2秒执行一次!
        CronTrigger cronTrigger = (CronTrigger) TriggerBuilder.newTrigger().startAt(date).endAt(endDate).withIdentity("cronTrigger","cronGroup").withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * ? * *")).build();



        System.out.println("现在时间:nowTime"+ simpleDateFormat.format(new Date()));

        //获取Scheduler调度器,
        SchedulerFactory sf = new StdSchedulerFactory();
        try {
            Scheduler scheduler =sf.getScheduler();
            //开始调度
            scheduler.start();
            //调度jobDetail和trigger
           // scheduler.scheduleJob(jobDetail,simpleTrigger);
            scheduler.scheduleJob(jobDetail,cronTrigger);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }


    }
}

MyJob类:

package cn.org.job;

import org.quartz.*;

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

/**
 * Created with IntelliJ IDEA.
 * User: Jayden
 * Date: 2018/7/31
 * Time: 8:47
 */
public class MyJob implements Job {
   
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        Date date = new Date();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH : mm: ss");
        System.out.println( "job当前时间:"+format.format(date));
       /* JobKey jobKey = context.getJobDetail().getKey();
        String name = jobKey.getName();
        String group = jobKey.getGroup();
        System.out.println("此任务的name: " + name + "组名称 :"+ group + "在"+format.format(date) + "开始运行!");
        JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();


        System.out.println("获取JobDetailMap 的message 的值:" +  jobDataMap.get("message") );*/

       //获取simpleTrigger的属性信息
        /*SimpleTrigger trigger = (SimpleTrigger) context.getTrigger();
        String jobName = trigger.getJobKey().getName();
        String jobGroup = trigger.getJobKey().getGroup();
        Date startTime = trigger.getStartTime();
        Date endTime = trigger.getEndTime();
        String triggerName = trigger.getKey().getName();
        String triggerGroup = trigger.getKey().getGroup();

        SimpleDateFormat format1 = new SimpleDateFormat("yyyy- MM -dd HH:mm:ss");


        System.out.println("任务的startTime:" + format1.format(startTime));
        System.out.println("jobDetail的name:" + jobName);
        System.out.println("jobDetail的group:" + jobGroup);
        System.out.println("trigger的name:" + triggerName);
        System.out.println("trigger的group:" + triggerGroup);
        System.out.println("任务的endTime:" + format1.format(endTime));*/

        //获取crontrigger的信息
        CronTrigger cronTrigger = (CronTrigger) context.getTrigger();
        String cronExpression = cronTrigger.getCronExpression();
        Date startTime = cronTrigger.getStartTime();
        Date endTime = cronTrigger.getEndTime();

        System.out.println("任务的startTime:" + format.format(startTime));
        System.out.println("cronTrigger的cron表达式:"+cronExpression);
       // System.out.println("任务的endTime:" + format.format(endTime));
        System.out.println("=====================================");

    }
}

 

以上是关于quartz 定时任务的总结 trigger SimpleTrigger CronTrigger的主要内容,如果未能解决你的问题,请参考以下文章

Quartz定时任务框架使用教程详解

Quartz总结:动态修改定时器二

分布式定时任务调度框架 - Quartz学习及实战记录笔记

分布式定时任务调度框架 - Quartz学习及实战记录笔记

quartz设置新增任务默认暂停

Java 定时任务 Quartz —— 并发