【问题标题】:Quartz SimpleScheduleBuilder with base time and interval in c#石英 SimpleScheduleBuilder 在 c# 中具有基本时间和间隔
【发布时间】:2019-11-20 05:58:37
【问题描述】:

有没有办法使用 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# cron quartz-scheduler quartz.net


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢@Marko 我正在使用 Quartz 在数据库中添加 next_run 时间,其他一切都由工作人员处理。是的,我们每次将 50 个工作分组..感谢您的解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多