Quartz.net - 调度程序在Windows服务中运行时触发不触发

时间:2010-09-22 15:25:33

标签: .net windows-services triggers quartz-scheduler

我有一个类库(c#,。net 4.0),它实现了Quartz.net Scheduler的包装类和一堆我想要执行的触发器和作业。这个包装类有一个简单的Start()和Stop()方法来启动或关闭Scheduler。

当我从控制台应用程序实例化我的包装器时,它会注册我的Jobs + Triggers,一切正常。所有工作都按预期执行,并在预期时执行。当我从Windows服务(我已经构建为调度程序的容器)中执行相同的操作时,一些触发器永远不会被触发而其他触发器按预期工作。

我的所有触发器都非常简单,就像执行每x分钟并永远重复一样。我连接了一个全局ITriggerListener并记录了所有内容。丢失的触发器不会触发,也不会失火。就好像他们不在场一样。

不幸的是,我没有设法为Quartz使用的Common.Logging基础设施设置日志记录,因此我没有任何关于内部发生的信息。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

您已经提到过在Windows服务中运行Quartz功能。 我假设你使用继承ScheduleService的东西,因此覆盖了OnStop()和OnStart(args()as String)方法,我假设你在服务OnStart方法中注册了你的Schedule和jobs和触发器。

如果是这种情况,请确保阻止垃圾收集器清除"你的对象。

Gc.KeepAlive(object)

例如,假设我们在OnStart中为Windows服务提供了一个System.Timers.Timer。我们必须告诉垃圾收集器单独留下计时器,之前在类级别定义了de timer(作为对象变量,而不是本地函数变量)

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实现类似吗?