Cron定时并行任务重复执行异常问题求助
定时Cron任务重复触发(提前1秒+定时点执行)问题排查
场景描述
我需要创建一组按指定Cron表达式并行执行的任务列表,初始配置5个Stream任务,Cron表达式如下:
Stream1 -> config.Cron = * 05 10 * * * Stream2 -> config.Cron = * 07 10 * * * Stream3 -> config.Cron = * 09 10 * * * Stream4 -> config.Cron = * 10 10 * * * Stream5 -> config.Cron = * 12 10 * * *
实现代码
用C#编写的实现逻辑如下:
List<Task> taskList = new List<Task>(); foreach (var config in _options) { var crontabSchedule = CrontabSchedule.Parse(config.Cron, new CrontabSchedule.ParseOptions { IncludingSeconds = true }); DateTime nextOccurrence = crontabSchedule.GetNextOccurrence(DateTime.Now); taskList.Add(Task.Run(async () => { while (!cancellationToken.IsCancellationRequested) { var delay = Math.Max(0, (int)nextOccurrence.Subtract(DateTime.Now).TotalMilliseconds); await Task.Delay(delay, cancellationToken); _logger.LogInformation($"Stream {config.StreamName} start."); await DoWork(); _logger.LogInformation($"Stream {config.StreamName} end."); nextOccurrence = crontabSchedule.GetNextOccurrence(DateTime.Now); } }, cancellationToken)); } if (taskList is not null && taskList.Any()) { await Task.WhenAll(taskList); }
预期与实际日志对比
预期日志(Serilog输出)
[2024/04/15 10:05:00] Worker Stream STREAM1 start. [2024/04/15 10:05:00] Worker Stream STREAM1 end. [2024/04/15 10:07:00] Worker Stream STREAM2 start. [2024/04/15 10:07:00] Worker Stream STREAM2 end. [2024/04/15 10:09:00] Worker Stream STREAM3 start. [2024/04/15 10:09:00] Worker Stream STREAM3 end. [2024/04/15 10:10:00] Worker Stream STREAM4 start. [2024/04/15 10:10:00] Worker Stream STREAM4 end. [2024/04/15 10:12:00] Worker Stream STREAM5 start. [2024/04/15 10:12:00] Worker Stream STREAM5 end.
实际日志
部分任务(如Stream4、Stream5)出现两次执行:一次在定时时间前1秒,一次在定时时间点,且并非每次都出现:
[2024/04/15 10:05:00] Worker Stream STREAM1 start. [2024/04/15 10:05:00] Worker Stream STREAM1 end. [2024/04/15 10:07:00] Worker Stream STREAM2 start. [2024/04/15 10:07:00] Worker Stream STREAM2 end. [2024/04/15 10:09:00] Worker Stream STREAM3 start. [2024/04/15 10:09:00] Worker Stream STREAM3 end. [2024/04/15 10:09:59] Worker Stream STREAM4 start. [2024/04/15 10:09:59] Worker Stream STREAM4 end. [2024/04/15 10:10:00] Worker Stream STREAM4 start. [2024/04/15 10:10:00] Worker Stream STREAM4 end. [2024/04/15 10:11:59] Worker Stream STREAM5 start. [2024/04/15 10:11:59] Worker Stream STREAM5 end. [2024/04/15 10:12:00] Worker Stream STREAM5 start. [2024/04/15 10:12:00] Worker Stream STREAM5 end.
后续测试情况
添加更多日志后,配置6个定时任务(分别在10:39、10:40、10:41、10:42、10:43、10:45执行),日志显示10:40、10:41、10:42的任务同样出现提前1秒执行并重复触发的情况:
2024/04/16 10:37:34 Number of task 6 2024/04/16 10:39:05 Default start. 2024/04/16 10:39:05 Default end. 2024/04/16 10:39:05 Default next occurrence 4/17/2024 10:39:05 2024/04/16 10:40:04 STREAM1 start. 2024/04/16 10:40:04 STREAM1 end. 2024/04/16 10:40:04 STREAM1 next occurrence 4/16/2024 10:40:05 2024/04/16 10:40:05 STREAM1 start. 2024/04/16 10:40:05 STREAM1 end. 2024/04/16 10:40:05 STREAM1 next occurrence 4/17/2024 10:40:05 2024/04/16 10:41:04 STREAM2 start. 2024/04/16 10:41:04 STREAM2 end. 2024/04/16 10:41:04 STREAM2 next occurrence 4/16/2024 10:41:05 2024/04/16 10:41:05 STREAM2 start. 2024/04/16 10:41:05 STREAM2 end. 2024/04/16 10:41:05 STREAM2 next occurrence 4/17/2024 10:41:05 2024/04/16 10:42:04 STREAM3 start. 2024/04/16 10:42:04 STREAM3 end. 2024/04/16 10:42:04 STREAM3 next occurrence 4/16/2024 10:42:05 2024/04/16 10:42:05 STREAM3 start. 2024/04/16 10:42:05 STREAM3 end. 2024/04/16 10:42:05 STREAM3 next occurrence 4/17/2024 10:42:05 2024/04/16 10:43:05 STREAM4 start. 2024/04/16 10:43:05 STREAM4 end. 2024/04/16 10:43:05 STREAM4 next occurrence 4/17/2024 10:43:05 2024/04/16 10:45:05 STREAM5 start. 2024/04/16 10:45:05 STREAM5 end. 2024/04/16 10:45:05 STREAM5 next occurrence 4/17/2024 10:45:05
求助
无法理解为何部分任务会出现这种提前1秒且重复执行的情况,求技术分析与解决办法。
内容的提问来源于stack exchange,提问作者Maxze
相关产品推荐
相关产品推荐

