【问题标题】:How to get Hangfire job scheduler to stagger my 20 minute interval jobs如何让 Hangfire 作业调度程序错开我的 20 分钟间隔作业
【发布时间】:2016-12-23 00:22:30
【问题描述】:

我有一些任务需要每 20 分钟运行一次。我可以在 Hangfire 中使用 cron 表达式 RecurringJob.AddOrUpdate(() => /* my method */, "*/20 * * * *")

来实现这一点

问题是,我的所有任务最终都会在完全相同的时间运行,例如00:00, 00:20, 00:40, 01:00

有没有人知道在不实施某种人工干预的情况下错开 20 分钟间隔任务的方法?

我希望 Hangfire 从我创建它们开始每 20 分钟运行一次作业,没什么特别的 :)

【问题讨论】:

  • 我认为没有内置对此的支持真是太可惜了。我不希望所有东西都同时运行,因为它们可能会碰到相同的数据库表并可能导致死锁。当然我可以解决它们,但我会觉得能够错开工作会更舒服。即使它只是按顺序执行了应在同一“cron 时间”运行的事情。想知道是否可以为此使用属性?

标签: c# cron scheduled-tasks hangfire


【解决方案1】:

实现此目的的一种“hacky”方法是设置small number of workers

app.UseHangfire(config =>
{
    config.UseServer(2);
});

// or
var server = new BackgroundJobServer(2);

您是否看到这个并说“哦,太好了!”或“这是一个糟糕的主意”将完全取决于您自己对 Hangfire 的使用。如果您每小时或每 15 分钟只运行几件事情,而您发现它们互相“踩踏”,那么这可能是一个简单的解决方案。

第二种方法:您可以创建一个异步任务并运行await Task.Delay(TimeSpan.FromSeconds(10)) 以进行短暂的延迟。这很可能会导致您的应用程序关闭得更慢,因为它会认为您仍在运行任务。所以我只在紧急情况下使用它,或者如果你对后果没意见。

希望 Hangfire 会在某个时候以更有条理的方式支持这一点。

【讨论】:

  • 请注意作业(现在)支持 CancellationTokens,因此您可以将其传递给应负责关闭的延迟。
【解决方案2】:

我会试试这个:首先,修改您的添加或更新以指定工作 ID:

RecurringJob.AddOrUpdate("some-id", () => /* my method */, "*/20 * * * *");

紧随其后

RecurringJob.Trigger("some-id");

To run a recurring job now, call the Trigger method.

更新:那么延迟工作而不是重复工作怎么样?您的“我的方法”最后会创建一个新的延迟作业(递归),设置为在 20 分钟后运行。第一次运行仍将使用 Trigger 方法。

【讨论】:

  • 这将使该方法立即运行,这很好,但随后它将回到每小时 20 分钟标记(00、20、40)的旧方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-28
  • 1970-01-01
  • 2020-03-04
  • 1970-01-01
  • 2015-03-24
相关资源
最近更新 更多