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

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 虽未直接暴露同名方法,但可以通过两种方式获取相同数值:

  1. 访问 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;
    
  2. 直接查询数据库表:
    如果使用持久化 JobStore(如 ADO.NET JobStore),触发次数会被保存到 qrtz_triggers 表的 TRIGGERED_COUNT 字段,直接查询该字段就能得到结果。

需要注意的是,TriggeredCount 的值会在每次触发器触发后自动更新,若使用持久化存储,该数值会同步保存到数据库,准确性有保障。

内容的提问来源于stack exchange,提问作者MO MI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:27:54