Quartz.NET中如何获取Cron Trigger的触发执行次数?
回答你的Quartz.NET相关问题
一、如何将触发器触发次数保存到数据库表中
Quartz.NET 默认的 ADO.NET JobStore 其实已经会持久化触发器的部分状态,但如果需要自定义存储触发次数到自己的业务表中,最直接的方式是通过**监听器(Listeners)**来实现,具体步骤如下:
- 实现 TriggerListener 或 JobListener:
你可以创建一个自定义的ITriggerListener,在触发器触发或完成的事件中,获取触发器标识和当前触发次数,再执行数据库更新操作。示例代码如下:public class TriggerCountListener : ITriggerListener { public string Name => "TriggerCountListener"; public Task TriggerFired(ITrigger trigger, IJobExecutionContext context, CancellationToken cancellationToken) { // 获取当前已触发次数 var triggeredCount = ((TriggerBase)trigger).TriggeredCount; // 执行自定义数据库更新逻辑,比如根据触发器Key保存次数到业务表 UpdateTriggerCountInDb(trigger.Key.Name, trigger.Key.Group, triggeredCount); return Task.CompletedTask; } // 其他接口方法返回默认实现即可 public Task<bool> VetoJobExecution(ITrigger trigger, IJobExecutionContext context, CancellationToken cancellationToken) => Task.FromResult(false); public Task TriggerMisfired(ITrigger trigger, CancellationToken cancellationToken) => Task.CompletedTask; public Task TriggerComplete(ITrigger trigger, IJobExecutionContext context, SchedulerInstruction triggerInstructionCode, CancellationToken cancellationToken) => Task.CompletedTask; } - 注册监听器到 Scheduler:
在初始化调度器时,把自定义监听器注册进去:scheduler.ListenerManager.AddTriggerListener(new TriggerCountListener());
如果只是需要读取触发次数而非自定义存储,也可以直接查询 Quartz 自带的数据库表(如 qrtz_triggers),其中的 TRIGGERED_COUNT 字段就记录了触发器已触发的次数。
二、Cron Trigger 是否有等效于 Simple Trigger 的 GetTimesTriggered() 方法
SimpleTrigger 的 GetTimesTriggered() 本质是获取已触发次数,CronTrigger 虽未直接暴露同名方法,但可以通过两种方式获取相同数值:
访问 TriggerBase 的 TriggeredCount 属性:
所有触发器(包括 CronTrigger)都继承自TriggerBase,这个基类的TriggeredCount属性就是已触发次数。通过类型转换即可获取:// 在Job内部通过上下文获取 var cronTrigger = context.Trigger as ICronTrigger; int triggeredCount = ((TriggerBase)cronTrigger).TriggeredCount; // 或者直接从调度器中获取触发器 var triggerKey = new TriggerKey("your-cron-trigger", "group"); var trigger = await scheduler.GetTrigger(triggerKey); int triggeredCount = ((TriggerBase)trigger).TriggeredCount;直接查询数据库表:
如果使用持久化 JobStore(如 ADO.NET JobStore),触发次数会被保存到qrtz_triggers表的TRIGGERED_COUNT字段,直接查询该字段就能得到结果。
需要注意的是,TriggeredCount 的值会在每次触发器触发后自动更新,若使用持久化存储,该数值会同步保存到数据库,准确性有保障。
内容的提问来源于stack exchange,提问作者MO MI
相关产品推荐
相关产品推荐

