Quartz运行原理

image.png

cron表达式

表达式格式(7个字段):秒 分 时 日 月 星期几 年, 例如:0 0 13 25 1 ? 2025

特殊符号
  • *星号可以理解为每的意思,每秒、每分、每天、每月、每年
  • ?问号只能出现在日和星期这两个位置,表示这个位置的值不确定
  • -减号表示一个范围。例如:小时字段10-12,表示10点到12点之间
  • ,逗号表示一个列表。例如:星期字段1,3,5 表示周一、周三、周五三天
  • / 斜杠表示频率。例如:秒字段0/15就是从0秒开始,每隔15秒执行一次

Scheduler调度器常用API

  • scheduler.scheduleJob(jobDetail, trigger)
    说明:生成一个新的定时任务
  • scheduler.pauseJob(jobKey)
    说明:暂停一个定时任务,参数jobKey代表该任务的唯一标识
  • scheduler.resumeJob(jobKey)
    说明:恢复一个定时任务,参数jobKey代表该任务的唯一标识
  • scheduler.deleteJob(jobKey)
    说明:删除一个定时任务,参数jobKey代表该任务的唯一标识
  • scheduler.rescheduleJob(triggerKey,trigger)
    说明:修改一个定时任务,triggerKey代表老触发器的key,trigger代表新触发器
  • scheduler.triggerJob(jobKey);
    说明:执行一次定时任务

实现动态调度的定时任务

  • 自定义任务类
MyJob implements Job
void execute(JobExecutionContext context)
  • 任务Bean
JobBean
String jobName
string jobclass
String cronExpression
  • 操作任务的工具栏(重点)
JobUtil
static void createJob(Scheduler scheduler, JobBean jobBean)
static void pauseJob(Scheduler scheduler, String jobName)
static void resumeJob(Scheduler scheduler, String jobName)
static void deleteJob(Scheduler scheduler, String  jobName)
static void runJobOnce(Scheduler scheduler, String jobName)
static void modifyJob(Scheduler scheduler, JobBean jobBean)
  • 编写控制器操作任务
QuartzController
String createJob()
String pauseJob()
String resumeJob()
String deleteJob()
String runJobOnce()
String modifyJob()
  • 关于修改定时任务的问题
    misfire
    问题描述
    当调度器执行 rescheduleJob(triggerKey,trigger)去更新某个triggerKey对应的新trigger时,会导致新trigger相关联的定时任务立即执行一次(暂停任务亦如此)。
    解决办法
    为CronscheduleBuilder设置withMisfireHandlingInstructionDoNothing()忽略所有错过的任务,按正常调度继续执行。

定时任务misfire机制

  1. 什么是misfire
    1.1. 定时任务被触发了称为 fire ,那么 misfire 自然就称之为"错过的触发"
    1.2. 误解:失火、哑火

  2. 为什么出现misfire
    2.1. 资源紧张,定时任务请求不到对应的线程
    2.2. 调度器关闭
    2.3. 设置定时任务的开始时间早于启动时间(未明确指定开始时间,则开始时间=启动时间)

  3. misfire的补偿
    3.1.不同的trigger,存在不同的补偿策略说明:本文针对CronTrigger讲解,SimpleTrigger的内容请自行查阅资料
    3.2. 补偿策略
    withMisfireHandlingInstructionDoNothing()
    说明:错过的不再补偿,然后正常调度
    withMisfireHandlingInstructionFireAndProceed()
    说明:错过的全部合并成一次,并立即补偿(即使任务终止时间已达到),然后正常调度。默认值
    withMisfireHandlingInstructionIgnoreMisfires()
    说明:错过的全部立即补偿(即使任务终止时间已达到),然后正常调度


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容