如何重置现有触发器的标识和描述?

时间:2015-02-11 05:22:48

标签: quartz.net

我有一个触发器,我正在通过一个编辑器,所以我可以更新/更改各种属性值,然后再将它发送回调度程序。在发送之前,我需要给它一个新的名称,组和描述。我最初使用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()的情况下重置现有触发器的名称,组和描述,我不介意这样做,但我找不到。

3 个答案:

答案 0 :(得分:0)

好的,明白了。

这是遗产问题;我试图获得一个基类(在这种情况下为AbstractTrigger)来假设其子类的值。当然,我们都知道 所处的位置。

这就是触发器子类具有默认值的原因。

我的触发器编辑器接受所有四种类型的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语句。

答案 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似乎没有受到影响,所以在这里包括它不应该是必要的。