Quartz定时任务并发控制浅谈
1.调度器和触发器
在定时任务中,调度器(Scheduler)和触发器(Trigger)是两个重要的概念,它们协同工作来实现定时任务的调度和执行。
- 调度器(Scheduler):负责协调和控制所有的触发器(Trigger)的执行。Scheduler 可以启动、暂停、恢复和停止触发器的执行,并管理任务的线程池,为每个任务提供一个独立的线程。
- 触发器(Trigger):触发器是定时任务的核心组件,它指定了任务应该在何时执行。Quartz 提供了多种类型的触发器,包括简单触发器(SimpleTrigger)、Cron 触发器(CronTrigger)、日历触发器(CalendarIntervalTrigger)等。
触发器有以下几个重要属性:
- 调度时间(Start Time):指定任务的开始执行时间。
- 结束时间(End Time):指定任务的结束执行时间。
- 执行次数(Repeat Count):指定任务的执行次数。
- 执行间隔(Repeat Interval):指定任务的执行间隔时间。
在使用 Quartz 进行定时任务调度时,一般需要通过编写 Job 类来实现具体的任务逻辑。Scheduler 将 JobDetail 和 Trigger 关联起来,并在触发时间到达时执行 Job。
总的来说,调度器和触发器是定时任务调度的核心组件,通过它们可以实现灵活、高效的定时任务调度。
2.并发/禁止并发控制
Quasrtz是通过@DisallowConcurrentExecution注解实现禁止并发的,这里指的是同一任务如果没执行完,则下一个任务不会开始。
原理如下:
-
当调度程序触发一个 Job 时,Quartz 会先获取一个的 Scheduler 实例。
-
如果 Job 上标注了 @DisallowConcurrentExecution 注解,则该 Job 类会被实例化为 Quartz 中的 JobDetail 对象,并且将其持久化到 Quartz 的数据库中。
-
然后,Quartz 会将该 JobDetail 对象分配给一个可用的 Trigger(触发器),并将其添加到调度程序的工作队列中。
-
如果该 Job 在执行期间被其他 Trigger 触发,则在 Job 正在执行时,Quartz 将不会重新启动该 Job 的另一个实例。当 Job 执行完毕时,Quartz 才会再次启动一个新的 Job 实例。
总的来说,@DisallowConcurrentExecution 注解通过限制同一时间只能有一个实例在执行,保证了 Job 的顺序性和完整性,避免了并发执行导致的数据错误和系统性能问题。
简单概括一下:@DisallowConcurrentExecution就是通过注解设置不同的jobclass,在Job并发执行时通过jobclass判断是两个触发器并发执行还是一个触发器等待执行。