zoukankan      html  css  js  c++  java
  • 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("=====================================");
    
        }
    }
  • 相关阅读:
    yii2之依赖注入与依赖注入容器
    MySQL查询性能优化
    MySQL索引(2)
    go es
    es数据操作入门
    es环境搭建
    gRPC接入etcd
    etcd简单介绍
    Go调用NSQ简单实践
    NSQ快速入门实践
  • 原文地址:https://www.cnblogs.com/laosunlaiye/p/9406602.html
Copyright © 2011-2022 走看看