c# - 石英 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 使用 10 分钟间隔将作业安排在 11:05(服务器的当前时间) - 他的作业应在 11:05、11:15、11:25、11:35 等触发
- 客户端 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();
您还可以考虑使用更少的触发器并处理更多的客户端。就像在触发器数据映射中具有组标识符并在每次调用时处理所有组的数据。自然看你的要求了。
推荐阅读
- azure-data-factory - 我在编写 azure 数据工厂复制活动以将数据从 azure delta Lake 提取到 azure SQL DB 时遇到困难
- ios - 正确使用 retrieveConnectedPeripheralsWithServices
- javascript - 获取用户输入的两个日历之间的天数差异
- javascript - Javascript 语句 document.getElementById('').style.display = "inline"; 稍后当我再次打开编辑器(Div)时生效
- sql - 从 xml 中提取值,它具有命名空间并解析 xml cdata
- javascript - 在 D3 中为传单设置动画而不更新底图
- java - 提交分配给 Kafka 使用者的分区时出错。CommitFailedException:提交无法完成,因为组已经重新平衡
- linux - 内核 defconfig 未正确应用所有设置
- r - 错误:“啁啾”的包或命名空间加载失败
- swift - Xcode 版本 12.5 (12E262) / Swift 布局约束错误 - 具有动态调整大小 textview 的 tableview