Quartz.NET:如何通过监听器追踪作业首次/末次执行及状态变更?
解决方案:基于Quartz.NET监听器实现作业状态同步与执行记录
核心监听器选择与方法映射
你需要结合**ISchedulerListener和IJobListener**(必要时补充ITriggerListener)来覆盖所有状态流转,以下是各状态对应的监听器方法及处理逻辑:
1. Created 状态
无需监听器触发:
- 用户提交作业后,后端调用
await scheduler.ScheduleJob(job, trigger)成功时,直接将作业状态设为Created,并持久化到存储(数据库/缓存)中。
2. Running 状态
通过**IJobListener**的两个方法来标记状态并记录执行时间:
JobToBeExecuted(IJobExecutionContext context):
作业即将开始执行时触发,这是作业从Created转为Running的节点。- 首次触发此方法时,记录当前时间为首次执行时间。
- 将作业状态更新为
Running并同步到前端。
JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException):
作业每次执行完成后触发,每次执行都覆盖更新末次执行时间(最终保留最后一次执行的时间)。
3. Canceled 状态
通过**ISchedulerListener的JobDeleted(JobKey jobKey)**方法捕获:
- 当调用
scheduler.DeleteJob(jobKey)成功后,此方法会被触发。 - 将对应作业的状态更新为
Canceled并同步到前端。
4. Finished 状态
通过**ITriggerListener的TriggerCompleted(ITrigger trigger, IJobExecutionContext context, SchedulerInstruction triggerInstructionCode)**方法捕获:
- 当触发器到达
EndAt时间、完成所有调度周期后,此方法会被触发。 - 将作业状态更新为
Finished,并以JobWasExecuted记录的最后一次时间作为末次执行时间,同步到前端。
监听器注册注意事项
要让监听器生效,需在Quartz调度器初始化时完成注册:
// 注册自定义Job监听器 scheduler.ListenerManager.AddJobListener(new YourCustomJobListener(), GroupMatcher<JobKey>.AnyGroup()); // 注册自定义Scheduler监听器 scheduler.ListenerManager.AddSchedulerListener(new YourCustomSchedulerListener()); // 注册自定义Trigger监听器 scheduler.ListenerManager.AddTriggerListener(new YourCustomTriggerListener(), GroupMatcher<TriggerKey>.AnyGroup());
前端状态同步建议
- 若需要实时性,采用WebSocket实时推送,监听器触发状态变更时直接推送更新到前端表格;
- 若对实时性要求不高,可让前端定时轮询后端接口获取最新状态和执行记录。
内容的提问来源于stack exchange,提问作者Marcel Müller
相关产品推荐
相关产品推荐

