如何重置现有触发器的身份和描述?
How to Reset an Existing Trigger's Identity and Description?
我有一个正在通过编辑器传递的触发器,因此我可以 update/change 各种 属性 值,然后再将其发送回调度程序。在发送之前,我需要给它一个新的名称、组和描述。我已经开始使用 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()
的情况下重置现有触发器的名称、组和描述,我不介意这样做,但我找不到。
好的,明白了。
这是一个继承问题;我试图获得一个基数 class(在本例中为 AbstractTrigger
)以假定其子 class 的值。当然,我们都知道 会导致什么结果。
这就是触发器 subclass 具有默认值的原因。
我的触发器编辑器接受所有四种类型的 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
语句。
或者......这只是一个理论......上面的代码是否可以作为一种解决方法,只是因为 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()
调用。我可能弄错了,但我相信如果包含它,我就不必使用缩小转换。
我仍在调查这可能是一个 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
这涵盖了两个子类触发器的 GetScheduleBuilder()
调用中缺少的内部方法调用。
SimpleTrigger 似乎没有受到影响,因此没有必要在此处包含它。
我有一个正在通过编辑器传递的触发器,因此我可以 update/change 各种 属性 值,然后再将其发送回调度程序。在发送之前,我需要给它一个新的名称、组和描述。我已经开始使用 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()
的情况下重置现有触发器的名称、组和描述,我不介意这样做,但我找不到。
好的,明白了。
这是一个继承问题;我试图获得一个基数 class(在本例中为 AbstractTrigger
)以假定其子 class 的值。当然,我们都知道 会导致什么结果。
这就是触发器 subclass 具有默认值的原因。
我的触发器编辑器接受所有四种类型的 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
语句。
或者......这只是一个理论......上面的代码是否可以作为一种解决方法,只是因为 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()
调用。我可能弄错了,但我相信如果包含它,我就不必使用缩小转换。
我仍在调查这可能是一个 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
这涵盖了两个子类触发器的 GetScheduleBuilder()
调用中缺少的内部方法调用。
SimpleTrigger 似乎没有受到影响,因此没有必要在此处包含它。