Springboot+Quartz(二)--Quartz核心类详解

上一篇写了一个简单的demo演示了Quartz用到了哪些接口和类,这一边就来具体讲讲这些接口和类的含义。
这一篇可以结合下一篇Quartz在项目中的使用结合起来看,这样能更加理解些

对了,这篇文章最实用重要的内容在最下面Cron,不想看理论的可以直接看到最下面

Quartz的核心:Job,Trigger,Scheduler

在这里插入图片描述

  • Job 为作业的接口,为任务调度的对象;
  • JobDetail 作业实例用来描述 Job 的实现类及其他相关的静态信息;
  • Trigger触发器做为作业的定时管理工具,一个 Trigger 只能对应一个作业实例,而一个作业实例可对应多个触发器
  • Scheduler 做为定时任务容器,是 Quartz 最上层的东西,它提携了所有触发器和作业,使它们协调工作,每个 Scheduler 都存有 JobDetail 和 Trigger 的注册,一个 Scheduler 中可以注册多个 JobDetail 和多个 Trigger。
  • Trigger和Job的name、group:
    • name是用来标记的
    • group是用来分组方便管理的

验证一个作业实例被多个触发器调用:

先说下:group组的作用,即定义的SimpleJob

是为了方便操作,可以同时对一组任务进行操作。

如停止一组任务或者触发器:
在这里插入图片描述

修改job2方便打印是哪个触发器触发:
public class SimpleJob2 extends QuartzJobBean {
   
    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
   
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("2 extends QuartzJobBean" + sdf.format(new Date()));
        //打印是哪个触发器触发
        System.out.println("======trigger by:" + jobExecutionContext.getTrigger());
    }
}
修改任务调度器内容,添加一个触发器:
public class TestSimpleJob1 {
   
    public static void main(String args[]) {
   
        try {
   
            // 获取一个调度程序的实例
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            // 定义一个job,并绑定SimpleJob1、2
            // 这里不回马上创建一个SimpleJob实例,实例创建时在scheduler安排任务出发执行时创建的
            // 设置job的名称及分组
            JobDetail jobDetail1 = JobBuilder.newJob(SimpleJob1.class).withIdentity("SimpleJob1", "SimpleJob").build();
            JobDetail jobDetail2 = JobBuilder.newJob(SimpleJob2.class).withIdentity("SimpleJob2", "SimpleJob").build();

            // 声明触发器
            Trigger trigger1 = TriggerBuilder.newTrigger().withIdentity("SimpleTrigger1", "SimpleJob").startNow()
                    .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever()).build();
            Trigger trigger2 = TriggerBuilder.newTrigger().withIdentity("SimpleTrigger2", "SimpleJob").startNow()
                    .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever()).build();
            Trigger trigger3 = TriggerBuilder.newTrigger().withIdentity("SimpleTrigger3", "SimpleJob")
                    .forJob("SimpleJob2", "SimpleJob").startNow()
                    .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(6).repeatForever()).build();

            scheduler.scheduleJob(jobDetail1, trigger1);
            scheduler.scheduleJob(jobDetail2, trigger2);
            scheduler.scheduleJob(trigger3);

            scheduler.start();
            Thread.sleep(30000);
            scheduler.shutdown();
        } catch (SchedulerException | InterruptedException e) {
   
            e.printStackTrace();
        }
    }
}
结果:可以看到2个触发器对同一个job执行了
10:56:32.026 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.simpl.PropertySettingJobFactory - Producing instance of Job 'SimpleJob.SimpleJob1', class=com.yhx.toali.Quartz.QuartzFrame.SimpleDemo.SimpleJob1
10:56:32.031 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggers
10:56:32.031 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.simpl.PropertySettingJobFactory - Producing instance of Job 'SimpleJob.SimpleJob2', class=com.yhx.toali.Quartz.QuartzFrame.SimpleDemo.SimpleJob2
10:56:32.044 [DefaultQuartzScheduler_Worker-1] DEBUG org.quartz.core.JobRunShell - Calling execute on job SimpleJob.SimpleJob1
1 implements Job2022-01-17 10:56:32
10:56:32.049 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggers
10:56:32.049 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.simpl.PropertySettingJobFactory - Producing instance of Job 'SimpleJob.SimpleJob2', class=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值