Quartz.Net工作并不总是在运行 - 找不到任何理由

时间:2010-07-26 23:28:35

标签: quartz.net

我们正在使用Quartz.Net安排大约200个重复工作。每个作业使用相同的IJob实现类,但它们可以具有不同的日程表。在实践中,他们最终有相同的时间表,因此我们有大约200个工作细节,每个细节都有自己的(相同的)重复/简单触发器,已安排。间隔是一小时。

此作业执行的任务是下载rss源,然后下载链接到rss源中的所有媒体文件。在下载之前,它会擦除​​放置文件的目录。单次运行需要几秒到十几秒(偶尔会更多)。

我们的调度方法是在新的StdSchedulerFactory上调用GetScheduler()(所有作业一次调度到同一个IScheduler实例中)。我们通过立即Start()跟进调度。

这些工作似乎运行良好,但经过仔细检查后,我们发现偶尔会有一小部分工作 - 或者几乎从未运行过。

所以,例如,所有200个工作应该在今晚6点40分运行。大多数人都这样做了。但少数没有。我通过查看文件时间戳来确定这一点,如果作业运行,它肯定会更新(因为它删除并重新下载文件)。

我启用了Quartz.Net日志记录,并为我们的代码添加了很多日志记录语句。

我得到的日志消息表明Quartz在一轮工作开始后大约一分钟就创建并执行了作业。

之后,所有活动都会停止。没有作业运行,也没有创建日志消息。零。

然后,在下一个发射间隔,Quartz再次启动,我的日志文件更新,各种文件开始下载。但是 - 它肯定看起来像一些JobDetail实例永远不会成为行的首脑(可以这么说)或者很少这样做。在整个周末,一些工作似乎经常更新,而且最近,其他人在星期五启动流程后没有更新一次(它在Windows服务shell中运行,顺便说一句)。

所以...我希望有人可以帮助我理解Quartz的这种行为。

我需要确定每个工作都在运行。如果错过了触发器,我需要Quartz尽快运行它。通过阅读文档,我认为这将是默认行为 - 对于具有无限重复计数的SimpleTrigger,如果错过触发器窗口,它将重新安排作业以立即执行。似乎并非如此。有什么方法可以确定为什么Quartz没有解雇这些工作?我正在跟踪级别,他们只是不在那里。它创建并执行了大量的工作,但如果我注意到一个缺失 - 我可以找到的是它最后一次运行它(例如,有时它没有运行数小时或数天)。没有关于它被跳过的原因(我希望Quartz能够记录某些东西如果它因任何原因跳过某个工作)等等。

任何帮助真的,真的很感激 - 我花了一整天时间试图解决这个问题。

1 个答案:

答案 0 :(得分:3)

阅读完你的帖子之后,听起来很像是一些没有执行的工作很可能会失误。我之所以这么认为:

  

我得到的日志消息表明Quartz在一轮工作开始后大约一分钟就创建并执行了作业。

在Quartz.NET中,默认的失火阈值是1分钟。您可能需要检查日志记录配置以确定未记录这些失火事件的原因。我敢打赌,如果你在日志记录上打开闸门(即设置一切进行调试,并确保你确实有一个Quartz调度程序类的日志指令),然后重新运行你的工作。我几乎肯定问题是你的日志中没有出现失火事件,因为日志配置缺乏某些东西。这是可以理解的,因为日志配置可能非常快速地混乱。

另外,将来你可能想咨询google上的quartz.net论坛,因为这是讨论一些棘手问题的地方。

http://groups.google.com/group/quartznet?pli=1

现在,您关于为调度程序应该执行的操作设置策略的另一个问题,我无法在那里特别为您提供帮助,但如果您仔细阅读API文档,并且还要咨询Google讨论组,那么您应该能够轻松设置适合您需要的失火政策标志。我相信Trigger有一个MisfireInstruction属性,你可以配置。

另外,我认为失火引入了很多“噪音”,应该避免;也许增加调度程序的线程数可以避免失火?另一种选择是将您的工作执行分成多个/多个批次。

祝你好运!

相关问题