在石英作业执行期间,我的一个活动可能每次运行(每分钟)一两个小时就会失败,因为依赖服务器因维护而停机。我注意到,当发生这种情况时,作业会停止运行,并且似乎在不记录任何我可以看到的异常的情况下取消预定。这项工作仍然在那里,因为我有另一个工作,并确保它在那里,我已经给出了分配的时间表,但工作本身停止执行。我假设有一些阈值可以删除一个导致连续异常x次数的作业,但我希望我能找到一个确定的答案。
我试图说服主要开发人员捕获异常并记录它而不是抛出一个通用异常并让它冒泡,但在那之前,我只能研究这个问题。
从本质上讲,这是执行代码。我还在类本身上设置了DisallowConcurrentExecution属性。当这个故障发生时,它发生在不到5秒的时间内,所以我不希望它在这里发挥作用:
public void Execute(IJobExecutionContext context)
{
_logger.Log("Starting synchronization.");
try
{
syncActivities();
}
catch (Exception ex)
{
_logger.Log("Error. ", ex);
throw;
}
finally
{
_logger.Log($"Completed synchronization.");
}
}
一旦我们升级到最新版本的石英,提供了一些全面的日志记录,我们发现我们偶尔会在构造函数中出现一些错误,导致Quartz自动将我们的作业触发器状态更改为ERROR or BLOCKED。我们在日志中没有看到这些因为它们是内部石英原木的一部分。为了解决这个问题,我们在工作经理和重新安排的工作中添加了对触发状态的检查,这些工作被发现处于任一状态。