Quartz SimpleScheduleBuilder 在 c# 中具有基本时间和间隔

Quartz SimpleScheduleBuilder with base time and interval in 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) 中使用基准时间?

试试这个来传递计算的具体开始时间:

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();

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