根据Quartz中的开始时间在Interval中安排任务

时间:2013-01-18 06:25:56

标签: vb.net quartz.net

我是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)

1 个答案:

答案 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的原因,但同样的原理适用于其他触发器。