Quartz.NET - 除了星期一凌晨3点以外每小时运行一次

时间:2014-09-11 18:35:01

标签: c# quartz-scheduler quartz.net quartz.net-2.0

除星期一早上凌晨3点外,每天每小时开办一项工作的最佳方法是什么?我的理想目标是在那个位置上有一个替代工作。

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

2 个答案:

答案 0 :(得分:3)

从较早的cron-related question/answer开始,我收到了使用两个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
    

答案 1 :(得分:0)

我的要求略有不同。但是,我以为id会留给以后的读者

基本上,您可以使用带有 CronExpression

CronTrigger 设置高级计划。

Lesson 6: 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
    • 星期几-表示),它会读取整个工作日