Quartz.net - триггер не срабатывает при запуске планировщика внутри службы Windows - PullRequest
0 голосов
/ 22 сентября 2010

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

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

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

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

1 Ответ

0 голосов
/ 13 мая 2014

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

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

Gc.KeepAlive(object)

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

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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...