我是Quartz的新手,希望使用它来为使用SQL Server Express的客户端服务在SQLServer中安排脚本。
我需要一个用户能够安排一个任务运行,比如从特定日期开始每隔一周。例如:StartDate = 1 / Jan / 2013 12:00 PM(星期二),每14天重复一次。
在作业设置中,有一个StartTime(日期时间),IntervalUnit(秒,分钟,小时,日,周,年)和RepeatsEvery(在开始日期之后要触发的间隔数)。
例如:设置StartDate =“1 / JAN / 2013 12:00 PM”和IntervalUnit =“DAY”并且RepeatsEvery = 14,将在每个第二个星期二中午12:00开始作业。如果StartDate已经通过,我需要在下一个开始日期开始工作,例如:如果我今天开始服务(18 / JAN / 2013),下一个开始日期将是29 / JAN / 2013 12:00 PM
我无法弄清楚如何使用Calendar Trigger在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)
答案 0 :(得分: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的原因,但同样的原理适用于其他触发器。