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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 14:47:33