You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 08:10:13