我们使用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能够记录某些内容,如果它因任何原因而跳过某个工作),等等.
任何帮助真的,真的很感激 - 我花了一整天时间试图解决这个问题.
读完你的文章后,听起来很像少数未执行的作业很可能会失败。我相信这一点的原因是:
我收到日志消息,表明 Quartz 在一轮作业开始后大约一分钟内正在创建和执行作业。
在 Quartz.NET 中,默认失火阈值是 1 分钟。您可能需要检查日志记录配置以确定为什么未记录这些失火事件。我敢打赌,如果您打开日志记录的闸门(即将所有内容设置为调试,并确保您确实有 Quartz 调度程序类的日志记录指令),然后重新运行您的作业。我几乎肯定问题是失火事件没有显示在您的日志中,因为日志记录配置缺少某些内容。这是可以理解的,因为日志记录配置很快就会变得非常混乱。
另外,将来您可能需要咨询 google 上的quartz.net 论坛,因为那里讨论了一些更棘手的问题。
http://groups.google.com/group/quartznet?pli=1
现在,关于设置调度程序应该执行的策略的另一个问题,我无法具体帮助您,但是如果您仔细阅读 API 文档,并且还咨询了 google 讨论组,您应该能够轻松设置适合您需求的失火政策标志。我相信触发器有一个您可以配置的 MisfireInstruction 属性。
另外,我认为失火会带来很多“噪音”,应该避免;也许增加调度程序上的线程数是避免失火的一种方法?另一种选择是将作业执行错开为单独/多个批次。
祝你好运!
| 归档时间: |
|
| 查看次数: |
5053 次 |
| 最近记录: |