定时任务调度Quartz总结

曾经终败给现在 2021-09-01 06:42 611阅读 0赞

前言

配置

pom.xml

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-quartz</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.quartz-scheduler</groupId>
  7. <artifactId>quartz</artifactId>
  8. <version>2.3.0</version>
  9. </dependency>

application

  1. quartz:
  2. job-store-type: jdbc
  3. scheduler-name: SpringBootScheduler
  4. properties:
  5. org:
  6. quartz:
  7. scheduler:
  8. instanceName: MyScheduler #此调度程序的名称,用来在用到多个调度器区分特定的调度器实例
  9. instanceId: NON_CLUSTERED #这个值必须是在所有调度器实例中是唯一的,尤其是在一个集群当中.想 Quartz 帮你生成这个值的话,可以设置为 AUTO。如果 Quartz 框架是运行在非集群环境中,那么自动产生的值将会是 NON_CLUSTERED
  10. jobStore:
  11. class: org.quartz.impl.jdbcjobstore.JobStoreTX
  12. driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
  13. tablePrefix: QRTZ_
  14. useProperties: false
  15. misfireThreshold: 60000
  16. threadPool:
  17. class: org.quartz.simpl.SimpleThreadPool
  18. threadCount: 25 #最多可以同时运行25个线程
  19. threadPriority: 5 #设置工作者的优先级 最高级别为10 ,最低级别为1
  20. threadsInheritContextClassLoaderOfInitializingThread: true

总结

核心类说明
Scheduler: 调度器,所有的调度都是由他控制
Scheduler即使Quartz的大脑,所有任务都是它来设置
Scheduler包含两个重要组件: JobStore和ThreadPool
JobStore是会来存储运行时的信息的,包含Trigger, Schedler , JobDetail , 业务锁
ThreadPool就是线程池,Quartz有自己的线程池实现,所有任务的都会由线程池执行

SchedulerFactory,顾名思义就是用来创建Scheduler了,有两个实现: DirectSchedulerFactory 和 StdSchedulerFactory,前者可以用来在代码里
定义你自己的Scheduler参数,后者时直接读取classpath下的quartz.properties(不存在就都使用默认值)配置来实例化scheduler.通常来将
我们使用StdulerFactory也就够了

SchedulerFactory 本身是支持创建RMT-stub的,可以用来管理远程scheduler,功能与本地一样

Trigger
1.SimpleTrigger
指定从某一个时间开始,以一定的时间间隔(单位是毫秒)执行的任务,它适合的任务类似于:09:00开始每个一小时,执行一次
他的属性有:
repeatInterval 重复问题
repeatCount 重复次数.实际执行次数是 repeatCount+1,因为在StartTime的时候一定会执行一次

  1. SimpleScheduleBuilder.simpleSchedule()
  2. .withIntervalInSeconds(10) //每隔10秒钟执行一次
  3. .repeatForever() //永远执行
  4. .build();
  5. SimpleScheduleBuilder.simpleSchedule()
  6. .withIntervalInMinutes(3) //每隔3分钟执行一次
  7. .withRepeatCount(3) //执行3次
  8. .build();

CalendarIntervalTrigger
类似于SimpleTigger,指定从某一个时间开始,以一定的时间间隔执行任务,但是不同的是SimpleTigger指定的时间间隔为毫秒,没办法
指定每一个月执行一次(每月的时间间隔不是固定值),而CalendarIntervalTrigger支持的间隔单位为秒,分钟,小时,天,月,年,星期

  1. CalendarIntervalScheduleBuilder.calendarIntervalSchedule()
  2. .withIntervalInDays(2) //每2天执行一次
  3. .build();
  4. CalendarIntervalScheduleBuilder.calendarIntervalSchedule()
  5. .withIntervalInWeeks(1) //每隔一周执行一次
  6. .build();

DailyTimeIntervalTrigger
指定某天的某个时间段内,以一定的时间间隔执行任务,并且它可以支持指定信息
它适合的任务类似于:指定每天9:00到18:00,每隔70秒钟执行一次,并且只要周一周五执行
它的属性有:
startTimerOfDay 每天开始时间
endTimerOfDay 每天结束时间
daysOfWeek 需要执行的星期
interval 执行间隔
intervalUtil 执行间隔的单位(秒 , 分钟 , 小时 , 天 , 月 , 年 , 星期)
repeatCount 重复次数

CronTrigger
适用于更复杂的任务,它支持类似于Linux Cron的语法,(并且更强大),基本上它覆盖了以上三个Trigger的绝大部分功能(但不是全部)
当然 也更难理解
它的属性只有: Cron表达式,但这个表达式本身就够复杂了

  1. CronScheduleBuilder.cronSchedule("0 0/2 10-12 * * ?") //每天10点-12点每两分钟执行一次
  2. .build();
  3. CronScheduleBuilder.weeklyOnDayAndHourAndMinute(MONDAY,9,30) //等同于 0 30 9 ? * MON
  4. .build();

发表评论

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

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

相关阅读