Springboot整合Quartz

简介: Springboot整合Quartz

 1、Quartz核心概念

首先我们需要明白 Quartz 的几个核心概念,这样理解起 Quartz 的原理就会变得简单了。

    1. Job 表示一个工作,要执行的具体内容。此接口中只有一个方法,如下:void execute(JobExecutionContext context)
    2. JobDetail 表示一个具体的可执行的调度程序,Job 是这个可执行程调度程序所要执行的内容,另外 JobDetail 还包含了这个任务调度的方案和策略。
    3. Trigger 代表一个调度参数的配置,什么时候去调。
    4. Scheduler 代表一个调度容器,一个调度容器中可以注册多个 JobDetail 和 Trigger。当 Trigger 与 JobDetail 组合,就可以被 Scheduler 容器调度了

    2、具体分析

    2.1 Job其实由三部分组成:

      •      JobDetail: 用于描述这个Job是做什么的
      •      一个实现Job接口的类:告诉Quartz具体干什么活的
      •     JobDataMap: 给 Job 提供参数用的
      JobDetailjobDetail=newJob(TestJob.class)
                      .withIdentity("job1","group2")
                      .usingJobData("test","sparrow")
                      .build();

      image.gif

      可以看到我们在创建JobDetail的时候,将要执行的job的类名传给了JobDetail,所以scheduler就知道了要执行何种类型的job。每次当scheduler执行job时,在调用其execute(…)方法之前会创建该类的一个新的实例;执行完毕,对该实例的引用就被丢弃了,实例会被垃圾回收;

      这种执行策略带来的一个后果是,job必须有一个无参的构造函数(当使用默认的JobFactory时);另一个后果是,在job类中,不应该定义有状态的数据属性,因为在job的多次执行中,这些属性的值不会保留,那这个时候JobDataMap就可以干活了,JobDataMap中可以包含不限量的(序列化的)数据对象,在job实例执行的时候,可以使用其中的数据。

      JobDataMap 除了像上面使用usingJobData 方式之外,还可以

      jobDetail.getJobDataMap().put("test","testOne");

      image.gif

      2.2 常用的两种Trigger

      Trigger 就是触发器的意思,用来指定什么时间开始触发,触发多少次,每隔多久触发一次。最常用SimpleTriggerCronTrigger这两种。

      2.2.1、SimpleTrigger

      Triggertrigger=newTrigger().withIdentity("myTrigger","group1")
                      .startNow()
                      .withSchedule(simpleSchedule()
                              .withIntervalInSeconds(5)
                              .withRepeatCount(10))
                      .build();

      image.gif

      SimpleTrigger的属性包括:开始时间、结束时间、重复次数以及重复的间隔;上面这段代码的意思就是从现在开始,每隔5s执行一次,一共执行10次。

      重复次数,可以是0、正整数,以及常量SimpleTrigger.REPEAT_INDEFINITELY。重复的间隔,必须是0,或者long型的正数,表示毫秒。注意,如果重复间隔为0,trigger将会以重复次数并发执行(或者以scheduler可以处理的近似并发数)。

      定义开始时间,比如下方代码:5s后开始     对应的结束使用endAt

      DatestartTime=DateBuilder.futureDate(5, DateBuilder.IntervalUnit.SECOND);
      Triggertrigger1=newTrigger().withIdentity("myTrigger","group1")
                      .startAt(startTime)
                      .build();

      image.gif

      2.2.2、CronTrigger

      使用CronTrigger最主要的就是Cron表达式,关于表达式后面会专门写一篇博文,这里直接放个例子了,每天上午10点42触发

      trigger=newTrigger()
          .withIdentity("trigger3", "group1")
          .withSchedule(dailyAtHourAndMinute(10, 42))
          .forJob("myJob", "group1")
          .build();

      image.gif

      或者

      trigger=newTrigger()
          .withIdentity("trigger3", "group1")
          .withSchedule(cronSchedule("0 42 10 * * ?"))
          .forJob("myJob", "group1")
          .build();

      image.gif

      3、Springboot整合Quartz

      以上只是简单地介绍了Quartz,好在整合过程中有个过度,更多内容可以查看Quartz相关资料

      pom.xml

      <dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.3.0</version></dependency>

      image.gif

      业务代码

      publicclassTestJobimplementsJob {
      @Overridepublicvoidexecute(JobExecutionContextjobExecutionContext) throwsJobExecutionException {
      JobDetailjobDetail=jobExecutionContext.getJobDetail();
      Stringtest=jobDetail.getJobDataMap().getString("test");
      System.out.println(test+newDate());
          }
      }

      image.gif

      测试类:

      @TestpublicvoidtestThree() throwsException{
      //创建调度器Schedulerscheduler=StdSchedulerFactory.getDefaultScheduler();
      //定义一个触发器Triggertrigger=newTrigger().withIdentity("myTrigger","group1")
                      .startNow()
                      .withSchedule(simpleSchedule()
                              .withIntervalInSeconds(5)
                              .withRepeatCount(5))
                      .build();
      //定义一个JobDetailJobDetailjobDetail=newJob(TestJob.class)
                      .withIdentity("job1","group2")
                      .usingJobData("test","sparrow")
                      .build();
      //调度加入这个jobscheduler.scheduleJob(jobDetail,trigger);
      //启动scheduler.start();
      //等待任务执行完再关闭Thread.sleep(20000);
      scheduler.shutdown(true);
          }

      image.gif

      执行结果:

      20200421153314404.png

      扩展:实际应用

      以上只是测试了一下是否可用,下面来个实际应用的例子:

      先创建一个任务类,具体的业务逻辑根据实际情况来,我这里是系统给我发送一个邮件

      publicclassDailyMailJobimplementsJob {
      Loggerlogger=LoggerFactory.getLogger(DailyMailJob.class);
      @AutowiredIMailServicemailService;
      @Overridepublicvoidexecute(JobExecutionContextjobExecutionContext) throwsJobExecutionException {
      Stringcontent="花有重开之日,人无再少年,走好脚下的路,笔直看眼前";
      mailService.sendSimpleMail("XXXXXXXX@qq.com", Constant.DAILY_SUBJECT,content);
      logger.info("----------------邮件已发送----------------");
          }
      }

      image.gif

      再写个任务调度配置类    这里只是简单举个例子

      @ConfigurationpublicclassSchedulerConfig {
      @AutowiredSchedulerscheduler;
      @BeanpublicvoidstartJob() throwsSchedulerException {
      customJobOne(scheduler);
      //启动scheduler.start();
          }
      privatevoidcustomJobOne(Schedulerscheduler) throwsSchedulerException {
      //创建调度器//Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();//定义一个触发器Triggertrigger=newTrigger().withIdentity("mailTriggerOne","mailGroup")
                     .startNow()
                     .withSchedule(cronSchedule("0 36 16 * * ?"))
                     .build();
      //定义一个JobDetailJobDetailjobDetail=newJob(DailyMailJob.class)
                     .withIdentity("mailJobOne","JobGroup")
                     .build();
      //调度加入这个jobscheduler.scheduleJob(jobDetail,trigger);
         }
      }

      image.gif

      结果:

      20200421164852255.png


      相关文章
      |
      8月前
      |
      负载均衡 监控 Dubbo
      91.【SpringBoot-03】(二)
      91.【SpringBoot-03】
      43 0
      |
      5月前
      |
      缓存 Java 数据挖掘
      SpringBoot整合定时任务技术Quartz
      SpringBoot整合定时任务技术Quartz
      58 0
      |
      5月前
      |
      SQL Java 调度
      SpringBoot 整合 Quartz 定时任务框架
      SpringBoot 整合 Quartz 定时任务框架
      66 0
      |
      5月前
      |
      Java 调度 Spring
      SpringBoot中实现定时任务(Quartz)(一)
      SpringBoot中实现定时任务(Quartz)
      42 0
      SpringBoot中实现定时任务(Quartz)(一)
      |
      5月前
      |
      Java 调度
      SpringBoot中实现定时任务(Quartz)(二)
      SpringBoot中实现定时任务(Quartz)
      29 0
      SpringBoot中实现定时任务(Quartz)(二)
      |
      7月前
      |
      Java BI 调度
      SpringBoot整合XXLJob
      XXLJob是一个分布式任务调度平台,优点:开发迅速、学习简单、轻量级、易扩展。是大众点评员工xxl创建并维护,基于 GPL-3.0 开源,可放心商用,目前已经拥有庞大的使用群体。 简单来说,就是一个定时任务中间件,类似的产品有当当网开源的Elastic-Job。
      1189 2
      SpringBoot整合XXLJob
      |
      9月前
      |
      存储 druid Java
      SpringBoot3集成Quartz
      Quartz由Java编写的功能丰富的开源作业调度框架,可以集成到几乎任何Java应用程序中,并且能够创建多个作业调度;
      106 0
      |
      12月前
      |
      Java 关系型数据库 调度
      Springboot整合quartz
      Springboot整合quartz
      |
      XML JavaScript Java
      SpringBoot(一):什么是SpringBoot?
      SpringBoot(一):什么是SpringBoot?
      340 0
      |
      监控 前端开发 Java
      什么是 SpringBoot?为什么要用 SpringBoot?
      什么是 SpringBoot?为什么要用 SpringBoot,2、Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?,3、运行 Spring Boot 有哪几种方式?,4、如何理解 Spring Boot 中的 Starters?,5、如何在 Spring Boot 启动的时候运行一些特定的代码?,6、Spring Boot 需要独立的容器运行吗?,7、Spring Boot 中的监视器是什么?,8、如何使用 Spring Boot 实现异常处理?,9、你如何理解 Spring Boot 中的 Starters?,10、springboot 常用的 starter 有哪些.