0

我是 Quartz 的新手,想用它来为使用 SQL Server Express 的客户端提供服务来调度 SQLServer 中的脚本。

我需要一个用户能够安排一个任务来运行,比如从特定日期开始每隔一周运行一次。例如:StartDate = 1/Jan/2013 12:00PM(星期二)并每 14 天重复一次。

在作业设置中,有 StartTime(日期时间)、IntervalUnit(秒、分钟、小时、日、周、年)和 RepeatsEvery(开始日期后触发的间隔数)。

例如:StartDate = "1/JAN/2013 12:00PM" 和 IntervalUnit = "DAY" 和 RepeatsEvery= 14 的设置将在每个第二个星期二下午 12:00 触发作业。如果 StartDate 已经过去,我需要在下一个开始日期触发该作业,例如:如果我今天(18/JAN/2013)启动服务,下一个开始日期将是 29/JAN/2013 12:00PM

我不知道如何使用日历触发器在 Quartz 中完成这项工作。这是 Quartz 内置的东西,还是我需要在启动时计算新的 StartTime?

假设我必须计算一个新的 StartTime,是否有任何内置函数或简洁的快捷方式,或者我是否需要为每个 IntervalUnit 提供一个类似的函数:

'Days
Dim diff As Integer
diff = Now.Subtract(.StartTime).TotalDays
Dim offset As Integer
offset = .RepeatsEvery - (diff Mod .RepeatsEvery)
offset = Now.AddDays(offset).Subtract(.StartTime).TotalDays 'Get the days from Start t preserve time of day
Start = .StartTime.AddDays(offset)
4

1 回答 1

1

您可以创建一个触发器,然后调用 trigger.GetFireTimeAfter(DateTime.Now) 来计算新的开始日期,然后使用新的 StartDate 构建和新的触发器。

以下是 C#,但希望能给你这个想法

var trigger = TriggerBuilder.Create()
                   .StartAt( new DateTimeOffset(new DateTime(2013,1,1)))
                   .WithSimpleSchedule(x=>x.RepeatForever()
                                          .WithInterval(new TimeSpan(14,0,0,0)))
                    .Build();                


var newStartingPoint = trigger.GetFireTimeAfter(DateTime.Now);

if (newStartingPoint.HasValue)  
{ 
     trigger = ((ISimpleTrigger) trigger).GetTriggerBuilder()
                                        .StartAt(newStartingPoint.Value)
                                        .Build();    
}

.GetTriggerBuilder() 在 ITrigger 上不可用,这就是您必须将触发器强制转换为 ISimpleTrigger 的原因,但同样的原理适用于其他触发器。

于 2013-01-18T10:41:27.000 回答