除了星期一早上 3 点之外,解决设置每天每小时运行的工作的最佳方法是什么?我的理想目标是在那个位置上换一份工作。
我将我的两个类设置为 Jobs - UpdateJob 和 FullJob。FullJob 是一个每周只能工作一次的工作。
除了星期一早上 3 点之外,解决设置每天每小时运行的工作的最佳方法是什么?我的理想目标是在那个位置上换一份工作。
我将我的两个类设置为 Jobs - UpdateJob 和 FullJob。FullJob 是一个每周只能工作一次的工作。
从一个较旧的与 cron 相关的问题/答案中,我收到了使用两个CronTrigger
s来完成此任务的想法:
“每一小时,每一天,除了星期一”:
* * * * SUN,TUE,WED,THU,FRI,SAT
“每周一,除凌晨 3 点外,每小时一小时”:
* 0,1,2,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 * * MON
我的要求略有不同。然而,我想我会把这个留给未来的读者。
基本上,您可以使用带有CronExpression的CronTrigger设置高级调度。
CronTriggers 通常比 SimpleTrigger 更有用,如果您需要一个基于类似日历的概念而不是根据 SimpleTrigger 的确切指定间隔重复出现的作业触发计划。
使用 CronTrigger,您可以指定触发时间表,例如“每个星期五中午”,或“每个工作日和上午 9:30”,甚至“每周一、周三上午 9:00 到上午 10:00 之间的每 5 分钟”和星期五”。
即便如此,像 SimpleTrigger 一样,CronTrigger 有一个 startTime 指定计划何时生效,以及一个(可选)endTime 指定何时应该停止计划。
Cron 表达式
Cron-Expressions 用于配置 CronTrigger 的实例。Cron-Expressions 是实际上由七个子表达式组成的字符串,用于描述计划的各个细节。这些子表达式用空格分隔,并表示:
- 秒
- 分钟
- 小时
- 日期
- 月
- 星期几
- 年份(可选字段)
完整的 cron 表达式的一个示例是字符串“0 0 12 ? * WED” - 意思是“每周三中午 12:00”。
示例实现
有很多方法可以设置和搭建 Quartz.Net,我使用的代码可能与其他实现有很大不同,但是有人可能会觉得这很有用。
public static void SetSchedule<T>(this IScheduler source, TimeSpan minWaitSeconds, string cron)
where T : IJob
{
var jobName = typeof(T).Name;
var triggerKey = new TriggerKey($"{jobName} Trigger");
DateTimeOffset minNextTime = DateTime.UtcNow.AddSeconds(2) + minWaitSeconds;
var trigger = TriggerBuilder.Create()
.WithIdentity(triggerKey)
.StartAt(minNextTime)
.WithCronSchedule(cron)
.Build();
var jobKey = new JobKey(jobName);
var job = JobBuilder.Create<T>()
.WithIdentity(jobKey)
.Build();
source.ScheduleJob(job, trigger);
}
用法
var startAt = new TimeSpan(0, 0, 0, 5);
var schedule = "0/5 * 8-16 ? * MON-FRI"
scheduler.SetSchedule<WarehousePickupNotificationJob>(startAt, schedule);
注意:我的用例是我需要在工作日的特定小时之间每 5 秒运行一次任务。
分解
"0/5 * 8-17 ? * MON-FRI"
0/5
/
字符可用于指定值的增量),读取为每 5 秒运行一次*
*
表示全部),读取所有分钟8-16
-
表示到),从“上午 8 点到下午 5 点”读取不是结束数字包括在内?
?
日期和星期几字段允许使用该字符。用于指定“无特定值”)*
*
表示全部),读取所有月份MON-FRI
-
表示到),读取所有工作日