2

除了星期一早上 3 点之外,解决设置每天每小时运行的工作的最佳方法是什么?我的理想目标是在那个位置上换一份工作。

我将我的两个类设置为 Jobs - UpdateJob 和 FullJob。FullJob 是一个每周只能工作一次的工作。

4

2 回答 2

3

从一个较旧的与 cron 相关的问题/答案中,我收到了使用两个CronTriggers来完成此任务的想法:

  1. “每一小时,每一天,除了星期一”:

    * * * * SUN,TUE,WED,THU,FRI,SAT
    
  2. “每周一,除凌晨 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
    
于 2014-09-11T21:20:34.890 回答
0

我的要求略有不同。然而,我想我会把这个留给未来的读者。

基本上,您可以使用带有CronExpression的CronTrigger设置高级调度。

第 6 课: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 秒运行一次
  • *
  • Minutes*表示全部),读取所有分钟
  • 8-16
  • 小时-表示到),从“上午 8 点到下午 5 点”读取不是结束数字包括在内
  • ?
  • Day-of-Month?日期和星期几字段允许使用该字符。用于指定“无特定值”)
  • *
  • 月份字段*表示全部),读取所有月份
  • MON-FRI
  • Day-of-Week-表示到),读取所有工作日
于 2018-12-03T05:19:51.577 回答