首页 > 解决方案 > 石英 SimpleScheduleBuilder 在 c# 中具有基本时间和间隔

问题描述

有没有办法使用 Quartz 触发器中的基本时间来生成下一次触发时间,方法是添加当前时间以在该特定时间分配计划作业,而不是按固定间隔运行每个计划作业。

例如,当我使用 10 分钟间隔时,下面的代码可以正常工作并生成下一个触发时间为 11:20、11:30、11:40 等。但是,如果我有 1000 个客户并且他们都使用 10 分钟的计划间隔,这将导致同时解雇 1000 个工作。

var trigger = SimpleScheduleBuilder
    .RepeatMinutelyForever(10)
    .Build();

var fireTime = trigger.GetFireTimeAfter(DateTime.UtcNow);
for (int i = 0; i < 10; i++)
{
    if (fireTime == null)
    {
        break;
    }
    Console.WriteLine(fireTime.Value.ToLocalTime());
    fireTime = trigger.GetFireTimeAfter(fireTime);
}

输出

11/20/2019 11:20:00 +05:30
11/20/2019 11:30:00 +05:30
11/20/2019 11:40:00 +05:30
11/20/2019 11:50:00 +05:30
11/20/2019 12:00:00 +05:30
11/20/2019 12:10:00 +05:30
11/20/2019 12:20:00 +05:30
11/20/2019 12:30:00 +05:30
11/20/2019 12:40:00 +05:30
11/20/2019 12:50:00 +05:30

但是如果我可以使用基准时间

  1. 客户端 1 使用 10 分钟间隔将作业安排在 11:05(服务器的当前时间) - 他的作业应在 11:05、11:15、11:25、11:35 等触发
  2. 客户端 2 使用 10 分钟间隔将作业安排在 11:08(服务器的当前时间) - 他的作业应该在 11:08、11:18、11:28、11:38 等触发

任何想法,我如何使用Quartz.net (3.07)中的基准时间 ?

标签: c#cronquartz-schedulerquartz.net

解决方案


试试这个来传递特定的开始时间进行计算:

var trigger = TriggerBuilder.Create()
    .StartAt(DateTimeOffset.UtcNow)
    .WithSchedule(SimpleScheduleBuilder.RepeatMinutelyForever(10))
    .Build();

或者使用特定的流畅界面进行简单的日程安排:

var trigger = TriggerBuilder.Create()
    .StartAt(DateTimeOffset.UtcNow)
    .WithSimpleSchedule(x => x.WithIntervalInMinutes(10).RepeatForever())
    .Build();

您还可以考虑使用更少的触发器并处理更多的客户端。就像在触发器数据映射中具有组标识符并在每次调用时处理所有组的数据。自然看你的要求了。


推荐阅读