2015-02-11 2 views
0

У меня есть триггер, который я передаю через редактор, поэтому я могу обновить/изменить различные значения свойств перед отправкой обратно в планировщик. Перед отправкой мне нужно указать новое имя, группу и описание. Я начал с использования 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

Я до сих пор исследуют возможность, что это может быть 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, похоже, не влияет, поэтому включение сюда здесь не требуется.

+0

Подтверждено: это [ошибка] (https://github.com/quartznet/quartznet/issues/237). Исправление запланировано для следующей версии. – InteXX

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 заявления для других типов триггеров.

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() вызова явно отсутствует из этого кода. Я мог ошибаться, но я считаю, что если бы это было включено, мне не пришлось бы использовать сужение конверсий.

Смежные вопросы