Quartz触发器

Quartz触发器

1. Trigger介绍

Quartz触发器_第1张图片

  • Quartz中四类不同的触发器,但在实际中常用的是CronTriggerSimpleTrigger
  • JobKey:表示job实例的标识,触发器被触发时,该指定的job实例会被执行
  • startTime:表示触发器的时间表,第一次开始被触发的时间,数据类型为Date
  • endTime:指定触发器终止被触发的时间,数据类型为Date

2. 使用

  • /**
     * @Author: Hjx
     * @Date: 2021/8/30 17:20
     */
    public class TestTriggerQuartz {
        public static void main(String[] args) throws SchedulerException {
    
            Date startDate = new Date();
            long time = startDate.getTime() + 10000;
            Date endDate = new Date(time);
    
            // 1. 获取调度器
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
    
            // 2. 获取JobDetail
            JobDetail jobDetail = JobBuilder.newJob(TestTriggerJob.class)
                    .withIdentity("JobDetail", "JobDetailGroup")
                    .build();
    
            // 3. 获取trigger
            Trigger trigger = TriggerBuilder.newTrigger()
                    .withIdentity("Trigger", "TriggerGroup")
                    .startAt(startDate)
                    .endAt(endDate)
                    .build();
    
            // 4. 通过调度器绑定任务和触发器
            scheduler.scheduleJob(jobDetail,trigger);
    
            //5. 启动
            scheduler.start();
        }
    }
    
  • /**
     * @Author: Hjx
     * @Date: 2021/8/30 17:20
     */
    public class TestTriggerJob implements Job {
    
        @Override
        public void execute(JobExecutionContext context) throws JobExecutionException {
            Trigger trigger = context.getTrigger();
            TriggerKey triggerKey = trigger.getKey();
            String name = triggerKey.getName();
            String group = triggerKey.getGroup();
            System.out.println("触发器名称:"+name);
            System.out.println("触发器组名称:"+group);
    
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date startTime = trigger.getStartTime();
            System.out.println("开始时间:"+simpleDateFormat.format(startTime));
            Date endTime = trigger.getEndTime();
            System.out.println("结束时间:"+simpleDateFormat.format(endTime));
    
        }
    }
    

3. SimpleTrigger

  • SimpleTrigger对于设置和使用是最简单的一种QuartzTrigger

  • 是为那种需要在特定的日期/时间启动,且以一个可能的时间间隔重复执行n次的Job设计的

  • 修改TestTriggerQuartz

  • /**
     * @Author: Hjx
     * @Date: 2021/8/30 17:20
     */
    public class TestTriggerQuartz {
        public static void main(String[] args) throws SchedulerException {
    
            Date startDate = new Date();
            long time = startDate.getTime() + 10000;
            Date endDate = new Date(time);
    
            // 1. 获取调度器
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
    
            // 2. 获取JobDetail
            JobDetail jobDetail = JobBuilder.newJob(TestTriggerJob.class)
                    .withIdentity("JobDetail", "JobDetailGroup")
                    .build();
    
            // 3. 获取trigger
            Trigger trigger = TriggerBuilder.newTrigger()
                    .withIdentity("Trigger", "TriggerGroup")
                    .startAt(startDate)
                    .withSchedule(
                            SimpleScheduleBuilder.repeatSecondlyForever(1)
                            .withRepeatCount(3)
                    )
                    .endAt(endDate)
                    .build();
    
            // 4. 通过调度器绑定任务和触发器
            scheduler.scheduleJob(jobDetail,trigger);
    
            //5. 启动
            scheduler.start();
        }
    }
    
  • 这样每隔一秒执行一次任务,执行三次,相似的SimpleScheduleBuilder方法还有

  • RepeatForever:指定触发器将无限期重复。
    WithRepeatCount:指定重复次数
    WithInterval:以毫秒为单位指定重复间隔,由于是TimeSpan也可以指定时分秒
    WithIntervalInHours:以小时为单位指定重复间隔
    WithIntervalInMinutes:以分钟单位指定重复间隔
    WithIntervalInSeconds:以秒为单位指定重复间隔
    
    RepeatMinutelyForever
    RepeatMinutelyForTotalCount
    RepeatSecondlyForever
    RepeatSecondlyForTotalCount
    RepeatHourlyForever
    RepeatHourlyForTotalCount
    
  • 在指定了结束时间和执行次数后,哪一个条件先执行完就结束,

  • 指定的间隔时间不能为0

4. CronTrigger

  • 需要像日历那样按照日程来触发任务
  • CronTrigger是基于日历的作业调度器

4.1 Cron表达式

  • cron表达式是一个由7个子表达式组成的字符串。每个子表达式都描述了一个单独的日程细节,以空格分隔,分别表示

  • Second 秒

  • Minutes 分钟

  • Hours小时

  • Day-of-Month 月中的天

  • Month 月

  • Day-of-Week 周中的天

  • Year 年(可选)

  • Quartz触发器_第2张图片

  • Quartz触发器_第3张图片

  • /**
     * @Author: Hjx
     * @Date: 2021/8/30 17:20
     */
    public class TestTriggerQuartz {
        public static void main(String[] args) throws SchedulerException {
    
            Date startDate = new Date();
            long time = startDate.getTime() + 10000;
            Date endDate = new Date(time);
    
            // 1. 获取调度器
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
    
            // 2. 获取JobDetail
            JobDetail jobDetail = JobBuilder.newJob(TestTriggerJob.class)
                    .withIdentity("JobDetail", "JobDetailGroup")
                    .build();
    
            // 3. 获取trigger 每秒都执行一次任务
            Trigger trigger = TriggerBuilder.newTrigger()
                    .withIdentity("Trigger", "TriggerGroup")
                    .withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ?"))
                    .build();
    
            // 4. 通过调度器绑定任务和触发器
            scheduler.scheduleJob(jobDetail, trigger);
    
            //5. 启动
            scheduler.start();
        }
    }
    运行结果:
    触发器名称:Trigger
    触发器组名称:TriggerGroup
    开始时间:2021-08-30 18:23:44
    触发器名称:Trigger
    触发器组名称:TriggerGroup
    开始时间:2021-08-30 18:23:44
    ······
    
  • 懒得写的可以找找在线的Cron表达式生成器,挺方便的

代码参考地址:Spring/Quartz · 萝卜7/点点滴滴汇成河 - 码云 - 开源中国 (gitee.com)

你可能感兴趣的:(Spring,java,spring,quartz)