SpringBoot集成Quartz(定时任务)

我不是女神ヾ 2023-10-01 16:23 126阅读 0赞

quartz是OpenSymphony开源组织在Job scheduling领域的开源项目,是由java开发的一个开源的任务日程管理系统。

quartz能做什么?

  • 作业调度:调用各种框架的作业脚本,例如shell,hive等。
  • 定时任务:在某一预定的时刻,执行你想要执行的任务。

架构图如下:

在这里插入图片描述
quartz包含的主要接口如下:

  • Scheduler 代表调度容器,一个调度容器中可以注册多个JobDetail和Trigger。
  • Job 代表工作,即要执行的具体内容。
  • JobDetail 代表具体的可执行的调度程序,Job是这个可执行程调度程序所要执行的内容。
  • JobBuilder 用于定义或构建JobDetail实例。
  • Trigger 代表调度触发器,决定什么时候去调。
  • TriggerBuilder 用于定义或构建触发器。
  • JobStore 用于存储作业和任务调度期间的状态。

以springboot集成quartz为例

pom

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-quartz</artifactId>
  4. </dependency>

创建真正的定时任务执行类,该类继承QuartzJobBean。

  1. public class QuartzTestJob extends QuartzJobBean {
  2. @Override
  3. protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
  4. String userName = (String) context.getJobDetail().getJobDataMap().get("userName");
  5. System.out.println("userName:" + userName);
  6. }
  7. }

创建调度程序JobDetail和调度器Trigger。

  1. @Configuration
  2. public class QuartzConfig {
  3. @Value("${sue.spring.quartz.cron}")
  4. private String testCron;
  5. /**
  6. * 创建定时任务
  7. */
  8. @Bean
  9. public JobDetail quartzTestDetail() {
  10. JobDetail jobDetail = JobBuilder.newJob(QuartzTestJob.class)
  11. .withIdentity("quartzTestDetail", "QUARTZ_TEST")
  12. .usingJobData("userName", "susan")
  13. .storeDurably()
  14. .build();
  15. return jobDetail;
  16. }
  17. /**
  18. * 创建触发器
  19. */
  20. @Bean
  21. public Trigger quartzTestJobTrigger() {
  22. //每隔5秒执行一次
  23. CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(testCron);
  24. //创建触发器
  25. Trigger trigger = TriggerBuilder.newTrigger()
  26. .forJob(quartzTestDetail())
  27. .withIdentity("quartzTestJobTrigger", "QUARTZ_TEST_JOB_TRIGGER")
  28. .withSchedule(cronScheduleBuilder)
  29. .build();
  30. return trigger;
  31. }
  32. }

在yml文件中配置参数:

  1. server:
  2. port: 8081
  3. sue:
  4. spring:
  5. quartz:
  6. cron: "*/5 * * * * ?"

这样就能每隔5秒执行一次QuartzTestJob类的executeInternal方法了。

CronTrigger配置格式:

  1. [秒] [分] [小时] [日] [月] [周] [年]

spring quartz跟spring task的cron表达式规则基本一致,只是spring4以上的版本去掉了后面的年,而quartz的CronTrigger的年是非必填的。

使用spring quartz的优缺点:

  • 优点:默认是多线程异步执行,单个任务时,在上一个调度未完成时,下一个调度时间到时,会另起一个线程开始新的调度,多个任务之间互不影响。支持复杂的cron表达式,它能被集群实例化,支持分布式部署。
  • 缺点:相对于spring task实现定时任务成本更高,需要手动配置QuartzJobBean、JobDetail和Trigger等。需要引入了第三方的quartz包,有一定的学习成本。不支持并行调度,不支持失败处理策略和动态分片的策略等。

多任务的问题,多个JobDetail使用同一个Trigger报错:Trigger does not reference given job:一个Job可以对应多个Trigger,但多个Job绑定一个Trigger报错

发表评论

表情:
评论列表 (有 0 条评论,126人围观)

还没有评论,来说两句吧...

相关阅读