Quartz.net — триггер не срабатывает, когда планировщик запускается внутри службы Windows

У меня есть библиотека классов (С#, .net 4.0), реализующая класс-оболочку для планировщика Quartz.net и множество триггеров и заданий, которые я хотел бы выполнить. Этот класс-оболочка имеет простой метод Start() и Stop() для запуска или остановки планировщика.

Когда я создаю свою оболочку из консольного приложения, она регистрирует мои задания + триггеры, и все работает нормально. Все задания выполняются так, как ожидалось, и когда ожидалось. Когда я делаю то же самое из службы Windows (которую я создал как контейнер для планировщика), некоторые триггеры никогда не срабатывают, в то время как другие работают должным образом.

Все мои триггеры очень просты, например, выполняться каждые x минут и повторяться вечно. Я подключил глобальный ITriggerListener и все удалил. Отсутствующие триггеры не срабатывают и не дают осечек. Их как бы нет.

К сожалению, мне не удалось настроить ведение журнала для инфраструктуры Common.Logging, используемой Quartz, поэтому у меня нет информации о том, что происходит внутри. Любая помощь приветствуется.


person Mats    schedule 22.09.2010    source источник
comment
Мне удалось заставить Quartz.NET + Common.Logging + log4net работать (отметьте dotnetsamples.codeplex.com, если вы интересно, как), но у меня та же проблема, когда дело доходит до запуска задания расписания в службе Windows, и, к сожалению, ведение журнала не помогает.   -  person Nano Taboada    schedule 14.12.2010
comment
Вы нашли какие-либо обновления или решение этой проблемы? Я только что заметил такое же поведение ... только мои триггеры в моем консольном приложении перестают срабатывать через некоторое время.   -  person Adam    schedule 08.04.2011


Ответы (1)


Вы упомянули, что запускаете функциональность Quartz внутри службы Windows. Я предполагаю, что вы используете что-то, наследующее ScheduleService, следовательно, переопределяете методы OnStop() и OnStart (args() as String), и я предполагаю, что у вас есть расписание, задания и триггеры, зарегистрированные внутри метода службы OnStart.

Если это так, убедитесь, что вы не позволяете сборщику мусора «очищать» ваши объекты.

Gc.KeepAlive(object)

Например, давайте представим, что у нас есть System.Timers.Timer внутри OnStart для службы Windows. Мы должны были бы сказать сборщику мусора оставить в покое таймер, предварительно определив таймер de на уровне класса (как объектную переменную, а не как локальную переменную функции)

Private timer As System.Timers.Timer

..и внутри OnStart()

timer As System.Timers.Timertimer = New System.Timers.Timer()
AddHandler timer.Elapsed, AddressOf Tick 'here you define that Tick method will handle it
timer.Enabled = true
timer.Interval = 200000
GC.KeepAlive(timer) 'tell the GC to leave alone the timer

Так что это может быть что-то подобное с вашей реализацией Quartz?

person diegosasw    schedule 12.05.2014