除星期一早上凌晨3点外,每天每小时开办一项工作的最佳方法是什么?我的理想目标是在那个位置上有一个替代工作。
我将我的两个类设置为Jobs - UpdateJob和FullJob。 FullJob是每周只能工作一次的人。
答案 0 :(得分:3)
从较早的cron-related question/answer开始,我收到了使用两个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
答案 1 :(得分:0)
我的要求略有不同。但是,我以为id会留给以后的读者
基本上,您可以使用带有 CronExpression
的 CronTrigger 设置高级计划。CronTriggers通常比SimpleTrigger有用,如果您需要 根据类似于日历的概念重复出现的解雇时间表 而不是在SimpleTrigger的确切指定间隔上。
使用CronTrigger,您可以指定触发时间表,例如“每个 “星期五中午”,或“每个工作日和上午9:30”,甚至“每5点” 每个星期一,星期三和上午9:00至10:00之间的分钟 星期五”。
即使如此,与SimpleTrigger一样,CronTrigger也具有startTime 指定时间表何时生效,以及(可选)endTime 指定何时应终止计划。
Cron表达式
Cron-Expressions用于配置CronTrigger的实例。 Cron-Expression是实际上由七个组成的字符串 子表达式,用于描述计划的各个详细信息。 这些子表达式用空格隔开,表示:
- 第二
- 分钟
- 小时
- 每月的一天
- 月
- 星期几
- 年份(可选字段)
完整的cron表达式的示例是字符串 “ 0 0 12? *周三-意思是“每个星期三中午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);
注意 :我的用例是,我需要一个Task在工作日的某些小时之间每5秒运行一次 >
故障
"0/5 * 8-17 ? * MON-FRI"
0/5
/
字符可用于指定值的增量),其读数为每5秒运行一次*
*
表示全部),它读取所有分钟8-16
-
表示为),它的读取时间是从“上午8点到下午5点”。
?
?
字符是允许使用的。它用于指定“无特定值” )*
*
表示全部),它读取所有月份MON-FRI
-
表示),它会读取整个工作日