如何重置现有触发器的身份和描述?

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 具有默认值的原因。

我的触发器编辑器接受所有四种类型的 ITriggerCalendarCronDailyTimeIntervalSimple)并且在我的高级通用中触发更新方法我没有执行必要的缩小转换。

这就是我最终得到的结果:(为了清楚起见,这次使用了完整的代码)

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 似乎没有受到影响,因此没有必要在此处包含它。