我有一个触发器,我正在通过一个编辑器,所以我可以更新/更改各种属性值,然后再将它发送回调度程序。在发送之前,我需要给它一个新的名称,组和描述。我最初使用ITrigger.GetTriggerBuilder()
创建了一个副本,但是我无法让IDailyTimeIntervalTrigger.RepeatCount
的值继续存在。
这是我到目前为止所尝试的内容:
sDescription = txtDescription.Text
sGroup = oEditor.Trigger.Key.Group
sName = txtName.Text
oNewTrigger = oEditor.Trigger.
GetTriggerBuilder.
WithIdentity(sName, sGroup).
WithDescription(sDescription).
Build
我也试过包括现有的时间表,如下:
sDescription = txtDescription.Text
sGroup = oEditor.Trigger.Key.Group
sName = txtName.Text
oNewTrigger = oEditor.Trigger.
GetTriggerBuilder.
WithIdentity(sName, sGroup).
WithDescription(sDescription).
WithSchedule(oEditor.Trigger.GetScheduleBuilder).
Build
但新触发器上的RepeatCount
始终具有默认值-1
。
如果有办法在不使用ITrigger.GetTriggerBuilder()
的情况下重置现有触发器的名称,组和描述,我不介意这样做,但我找不到。
答案 0 :(得分:0)
好的,明白了。
这是遗产问题;我试图获得一个基类(在这种情况下为AbstractTrigger
)来假设其子类的值。当然,我们都知道 所处的位置。
这就是触发器子类具有默认值的原因。
我的触发器编辑器接受所有四种类型的ITrigger
(Calendar
,Cron
,DailyTimeInterval
和Simple
)以及我的高级常规触发器更新方法我没有进行必要的缩小转换。
所以这就是我最终的结果:(这次是完整的代码,为了清晰起见)
Private Sub UpdateTrigger(Editor As TriggerEditor)
Dim oBuilder As IScheduleBuilder
Dim _
oOldTrigger,
oNewTrigger As ITrigger
Dim _
sDescription,
sGroup,
sName As String
oOldTrigger = Editor.Trigger
oBuilder = oOldTrigger.GetScheduleBuilder
sDescription = txtDescription.Text
sGroup = oOldTrigger.Key.Group
sName = txtName.Text
Select Case Editor.TriggerType
Case TriggerTypes.CalendarInterval
Case TriggerTypes.Cron
Case TriggerTypes.DailyTimeInterval
DirectCast(oBuilder, DailyTimeIntervalScheduleBuilder).
WithRepeatCount(DirectCast(oOldTrigger, IDailyTimeIntervalTrigger).RepeatCount)
Case TriggerTypes.Simple
End Select
oNewTrigger = oOldTrigger.
GetTriggerBuilder.
WithIdentity(sName, sGroup).
WithDescription(sDescription).
WithSchedule(oBuilder).
Build
Me.Scheduler.RescheduleJob(oOldTrigger.Key, oNewTrigger)
End Sub
现在剩下的就是为其他触发器类型构建剩余的Select Case
语句。
答案 1 :(得分:0)
或者......这只是一个理论......由于Quartz.NET中的一个错误,上面的代码是否只是一个必要的解决方法?
以下是相关来源:
/// <summary>
/// Get a <see cref="IScheduleBuilder" /> that is configured to produce a
/// schedule identical to this trigger's schedule.
/// </summary>
/// <returns></returns>
/// <see cref="TriggerBuilder"/>
public override IScheduleBuilder GetScheduleBuilder()
{
DailyTimeIntervalScheduleBuilder cb = DailyTimeIntervalScheduleBuilder.Create()
.WithInterval(RepeatInterval, RepeatIntervalUnit)
.OnDaysOfTheWeek(DaysOfWeek)
.StartingDailyAt(StartTimeOfDay)
.EndingDailyAt(EndTimeOfDay);
switch (MisfireInstruction)
{
case Quartz.MisfireInstruction.DailyTimeIntervalTrigger.DoNothing:
cb.WithMisfireHandlingInstructionDoNothing();
break;
case Quartz.MisfireInstruction.DailyTimeIntervalTrigger.FireOnceNow:
cb.WithMisfireHandlingInstructionFireAndProceed();
break;
}
return cb;
}
此代码中明显缺少DailyTimeIntervalScheduleBuilder.WithRepeatCount()
电话。我可能会弄错,但我相信如果包括在内,我就不必使用缩小的转换次数。
答案 2 :(得分:0)
我还在调查这可能是一个Quartz.NET错误的可能性,但与此同时,如果其他人遇到同样的问题,那么我最终得到的代码是:
Public Module Quartz
<Extension>
Public Function GetSchedule(Trigger As ITrigger) As IScheduleBuilder
GetSchedule = Trigger.GetScheduleBuilder
Select Case Trigger.GetType.Name
Case "CalendarIntervalTriggerImpl"
With DirectCast(Trigger, ICalendarIntervalTrigger)
DirectCast(GetSchedule, CalendarIntervalScheduleBuilder).
PreserveHourOfDayAcrossDaylightSavings(.PreserveHourOfDayAcrossDaylightSavings).
SkipDayIfHourDoesNotExist(.SkipDayIfHourDoesNotExist).
InTimeZone(.TimeZone)
End With
Case "DailyTimeIntervalTriggerImpl"
With DirectCast(Trigger, IDailyTimeIntervalTrigger)
DirectCast(GetSchedule, DailyTimeIntervalScheduleBuilder).
WithRepeatCount(.RepeatCount).
InTimeZone(.TimeZone)
End With
End Select
End Function
End Module
这包括两个子类触发器中缺少的内部方法调用&#39; GetScheduleBuilder()
来电。{/ p>
SimpleTrigger似乎没有受到影响,所以在这里包括它不应该是必要的。