Quartz定时任务并发控制浅谈

1.调度器和触发器

在定时任务中,调度器(Scheduler)和触发器(Trigger)是两个重要的概念,它们协同工作来实现定时任务的调度和执行。

  1. 调度器(Scheduler):负责协调和控制所有的触发器(Trigger)的执行。Scheduler 可以启动、暂停、恢复和停止触发器的执行,并管理任务的线程池,为每个任务提供一个独立的线程。
  2. 触发器(Trigger):触发器是定时任务的核心组件,它指定了任务应该在何时执行。Quartz 提供了多种类型的触发器,包括简单触发器(SimpleTrigger)、Cron 触发器(CronTrigger)、日历触发器(CalendarIntervalTrigger)等。

触发器有以下几个重要属性:

  • 调度时间(Start Time):指定任务的开始执行时间。
  • 结束时间(End Time):指定任务的结束执行时间。
  • 执行次数(Repeat Count):指定任务的执行次数。
  • 执行间隔(Repeat Interval):指定任务的执行间隔时间。

在使用 Quartz 进行定时任务调度时,一般需要通过编写 Job 类来实现具体的任务逻辑。Scheduler 将 JobDetail 和 Trigger 关联起来,并在触发时间到达时执行 Job。

总的来说,调度器和触发器是定时任务调度的核心组件,通过它们可以实现灵活、高效的定时任务调度。

2.并发/禁止并发控制

Quasrtz是通过@DisallowConcurrentExecution注解实现禁止并发的,这里指的是同一任务如果没执行完,则下一个任务不会开始。

原理如下:

  1. 当调度程序触发一个 Job 时,Quartz 会先获取一个的 Scheduler 实例。
  2. 如果 Job 上标注了 @DisallowConcurrentExecution 注解,则该 Job 类会被实例化为 Quartz 中的 JobDetail 对象,并且将其持久化到 Quartz 的数据库中。
  3. 然后,Quartz 会将该 JobDetail 对象分配给一个可用的 Trigger(触发器),并将其添加到调度程序的工作队列中。
  4. 如果该 Job 在执行期间被其他 Trigger 触发,则在 Job 正在执行时,Quartz 将不会重新启动该 Job 的另一个实例。当 Job 执行完毕时,Quartz 才会再次启动一个新的 Job 实例。

总的来说,@DisallowConcurrentExecution 注解通过限制同一时间只能有一个实例在执行,保证了 Job 的顺序性和完整性,避免了并发执行导致的数据错误和系统性能问题。

简单概括一下:@DisallowConcurrentExecution就是通过注解设置不同的jobclass,在Job并发执行时通过jobclass判断是两个触发器并发执行还是一个触发器等待执行。