【问题标题】:Quartz C# Scheduler - Prevent Job from automatically retrying after 15 minutesQuartz C# Scheduler - 防止作业在 15 分钟后自动重试
【发布时间】:2017-03-01 14:51:28
【问题描述】:

我想运行一项需要很长时间才能完成的工作。然而 15 分钟后,触发器在作业完成之前被重新触发。我想这是处理失败作业的默认故障保险。如何将此超时时间增加到 30 分钟?

这是我的作业调度程序代码:

var trigger = TriggerBuilder.Create()
            .WithIdentity(triggerName, triggerGroup)
            .WithSchedule(CronScheduleBuilder
                .CronSchedule(cronExpression).InTimeZone(TimeZoneInfo.Utc))
                .Build();

var scheduleRequestJob = JobBuilder.Create<T>()
            .WithIdentity(taskName, taskGroup)
            .Build();

        _scheduler.ScheduleJob(scheduleRequestJob, trigger);

【问题讨论】:

  • Quartz 中没有这样的故障安全时间。 CronTrigger 是如何定义的(cronExpression)?
  • @Rabban 这个特定工作的 cron 表达式是“0 30 12 ? * MON-FRI *”。每个工作日中午 12:30
  • 从历史上看,这是由创建 pid/lock 文件的任务处理的,而 lock 文件在那里拒绝启动第二个副本
  • 我觉得这个表情不错。我给你写了一个答案,如何通过一些额外的解释来防止这种奇怪的行为。给我几分钟;)

标签: c# quartz.net


【解决方案1】:

Quartz 没有故障安全时间。 Quartz 只有两种可能会重新触发您的工作。

  1. 触发执行时间过短,将在最后一次运行结束前触发。从您的 CronExpression 中我们可以看出,情况并非如此。
  2. 您的工作会引发JobExecutionException - (Api),这将立即重新安排您的工作。

为防止一个作业同时运行多次,请将DisallowConcurrentExecutionAttribute - (Api) 添加到您的类中。

[DisallowConcurrentExecution]
public class MyJob: IJob
{
}

这确保了你想要的行为。

【讨论】:

  • 我不确定是否引发了异常。它重试了 5 次,正好在上一次触发后 15 分钟。幸运的是,在第 5 次之后,这项工作在 14 分 16 秒内完成,因此没有重试。是否有可能在 15 分钟后引发 JobExecutionException?在过去的几个月里,同样的工作一直在运行,没有任何问题。 DisallowConcurrentExecution 会阻止同一个作业多次运行吗?
  • @Dan_Dan_Man 是的,它会阻止这种情况。我将编辑我的答案以使其更清楚。 JobExecutionException 必须由您明确抛出才能按描述工作。目前我无法解释为什么 Quartz 试图重新触发你已经运行的工作。请确保您的 Job 无异常运行,并且不要抛出 JobExecutionException
  • 好的,谢谢。我会试试这个,让你知道它是怎么回事。在我的工作中可能会抛出异常,但我从来没有抛出 JobExecutionException。尽管在这种特殊情况下,我认为没有引发任何异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-17
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多