Bri*_*nga 4 quartz.net quartz.net-2.0
使用Quartz.net安排作业时,实例化作业时偶尔会收到异常。这进而导致Quartz将作业的触发器设置为错误状态。发生这种情况时,触发器将停止触发,直到发生一些手动干预为止(由于我正在使用内存中的作业调度,因此要重新启动服务)。
如何防止设置错误状态,或者至少告诉Quartz重试处于错误状态的触发器?
发生异常的原因是由于获取传递到作业的构造函数的配置数据所需的不稳定网络调用。我正在使用自定义的IJobFactory来执行此操作。
我看过其他没有解决方法的参考资料:
作为记录,我认为这是Quartz的设计缺陷。如果一个工作不能被一次构造,那并不意味着它不能总是被构造。这是暂时性错误,应这样处理。停止所有将来计划的工作违反了最小惊讶原则。
无论如何,我的黑客解决方案是捕获由于我的工作构造而导致的任何错误,而不是抛出错误或返回null以返回自定义IJob而不是简单地记录错误。这不是完美的,但至少不能阻止将来触发该作业。
public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
{
try
{
var job = this.container.Resolve(bundle.JobDetail.JobType) as IJob;
return job;
}
catch (Exception ex)
{
this.logger.Error(ex, "Exception creating job. Giving up and returning a do-nothing logging job.");
return new LoggingJob(this.logger);
}
}
Run Code Online (Sandbox Code Playgroud)
当触发器无效IJob类发生异常时,触发器将其TRIGGER_STATE更改为ERROR,然后在此状态下触发将不再触发。
要重新启用触发器,您需要将其状态更改为WAITING,然后可能再次触发。在此示例中,您如何重新启用误触发的触发器。
var trigerKey = new TriggerKey("trigerKey", "trigerGroup");
if (scheduler.GetTriggerState(trigerKey) == TriggerState.Error)
{
scheduler.ResumeTrigger(trigerKey);
}
Run Code Online (Sandbox Code Playgroud)
小智 5
实际上,将触发器从错误状态重置的最佳方法是:
private final SchedulerFactoryBean schedulerFactoryBean;
Scheduler scheduler = schedulerFactoryBean.getScheduler();
TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroup);
if (scheduler.getTriggerState(triggerKey).equals(Trigger.TriggerState.ERROR)) {
scheduler.resetTriggerFromErrorState(triggerKey);
}
Run Code Online (Sandbox Code Playgroud)
笔记:
您永远不应该手动修改来自第三方库或软件的表中的记录。如果有任何功能,所有更改都应通过 API 对该库进行。
JobStoreSupport.resetTriggerFromErrorState
| 归档时间: |
|
| 查看次数: |
9304 次 |
| 最近记录: |