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

Quartz.Net突然失效:日志显示‘Batch acquisition of 0 triggers’

Quartz任务调度器突然失效:日志显示“Batch acquisition of 0 triggers”问题排查与解决

我基于.NET Core Windows服务使用Quartz搭建任务调度器,代码完全遵循官方文档实现,此前本地及Dev服务器运行均正常,但近期突然失效。日志中频繁出现Batch acquisition of 0 triggers,任务不再触发,尝试多种方法仍未解决。以下是核心代码片段:

代码片段

Program.cs

builder.Services.AddQuartz(q => {
    JobKey jobkey = new JobKey("QuartzDemoKey");

    q.UseMicrosoftDependencyInjectionJobFactory();
    q.AddJob<Worker>(config => config.WithIdentity(jobkey));
    q.AddTrigger(config => 
        config.WithIdentity("QuartzDemoTrigger")
              .WithCronSchedule("0 0/15 * * * ?")
              .ForJob(jobkey));
});

Worker.cs

public class Worker : IJob
{
    private readonly ScannerService _scannerService;
    private readonly ILogger<Worker> _logger;
    private readonly TimeSpan _interval = TimeSpan.FromDays(7);
    private readonly Dictionary<string, SanctionContext> _dbDictionary;
    private readonly IConfiguration _configuration;

    public Worker(
        ScannerService scannerService,
        ILogger<Worker> logger,
        Dictionary<string, SanctionContext> dbDictionary,
        IConfiguration configuration) =>
        (_scannerService, _logger, _dbDictionary, _configuration) = (scannerService, logger, dbDictionary, configuration);

    public Task Execute(IJobExecutionContext context)
    {
        Console.WriteLine("Quartz is running now");
        try
        {
            var counter = 0;

            _logger.LogWarning("Starting service");
            _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);

            _scannerService.InitiateScanner(_dbDictionary, _logger, _configuration);

            _logger.LogInformation("Service ends at: {time} {runCounter}", DateTimeOffset.Now, counter);
            counter++;
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "{Message}", ex.Message);
        }

        return Task.CompletedTask;
    }
}

排查方向与解决方案

1. 确认Quartz调度器宿主服务是否注册

你的代码中缺少Quartz调度器的启动配置,必须添加AddQuartzHostedService才能让Quartz在后台运行并扫描触发器:

// 在Program.cs的Quartz配置后添加以下代码
builder.Services.AddQuartzHostedService(q => q.WaitForJobsToComplete = true);

2. 验证Cron表达式有效性

检查Cron表达式0 0/15 * * * ?是否符合预期:

  • 临时替换为每秒触发的表达式* * * * * ?,测试任务是否能正常执行,排除表达式本身的问题
  • 确认服务器时区与本地开发环境一致,避免时区差异导致触发时间偏移

3. 检查依赖服务注册状态

Worker类依赖的ScannerService、Dictionary<string, SanctionContext>等服务需确保在DI容器中正确注册:

  • 确保Dictionary<string, SanctionContext>以单例模式注册,避免每次Job实例化时创建新对象导致异常:
    builder.Services.AddSingleton<Dictionary<string, SanctionContext>>();
    
  • 检查ScannerService是否存在循环依赖或实例化失败的情况,此类问题会导致Quartz无法创建Job实例,进而无法匹配触发器

4. 排查任务执行异常导致的触发器暂停

虽然Execute方法有异常捕获,但需确认:

  • 是否存在未被捕获的异常(如注释掉的TaskCanceledException)导致Quartz标记触发器为暂停状态
  • 查看完整日志,确认是否有Job执行失败的记录,若存在需修复业务逻辑中的异常,或手动重置触发器状态

5. 检查Quartz存储配置(若使用持久化)

如果配置了数据库持久化存储:

  • 确认数据库连接正常,触发器数据未被意外删除或修改
  • 检查Quartz的持久化配置是否正确,避免因存储异常导致触发器无法被读取

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 09:23:23