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
相关产品推荐
相关产品推荐

