在HangFire中设置仅限“按需”执行的作业

19

在 Hangfire 中,我已经成功设置了定期作业,并且可以通过 Web UI 和其 "trigger" 按钮手动触发,非常感谢。

RecurringJob.AddOrUpdate(..);

在此输入图片描述

我愿意设置一个永远不会自动触发的工作,只能从WebUi上按需求触发。可以将其看作一组只在需要时手动触发的维护任务。

我考虑添加一个非重复的等待状态的Job,但无法实现(并且这听起来也不对)。

Hanfire是否支持“仅按需求”工作?


3
我的工作是创建一个控制器来触发任务。制作一个管理员页面,其中有一个按钮调用一个动作将任务加入队列。 - aethercowboy
1
@Rob,“2月31日”的解决方案不起作用,很遗憾。Hangfire似乎在尝试查找与表达式匹配的下一个实际日历日期时抛出了异常(最终在寻找这样的日期时超过了9999年)。 (截至Hangfire v1.6.4) - Jon Schneider
1
@JonSchneider 真是不幸!我并没有测试过它,只是觉得它可能值得一试,因为它使用了cron表达式。我会删除这条评论,以免误导未来的人们。 - Rob
@Askolein,我的情况是触发器现在按钮随机触发相同的工作2次,你有任何想法吗? - Dreamer
5个回答

23

我使用了这个(hangfire 1.7 在 .net 4.6.2 上)

RecurringJob.AddOrUpdate(() => ..., "0 0 31 2 0");

在仪表板上它显示为:

下次执行时间未知


8
我将这个CRON表达式解释为永不执行:0 0 29 2/12000 WED 也就是说,每一百年的二月二十九日(闰年)的午夜时分,如果这一天刚好是星期三,那么就会执行该任务。
正如 @youen 发现的那样,这个表达式实际上会导致一个更晚的日期。正确的表达式应该�� "0 0 29 2/12000 MON"。

3
实际上,这个 "0 0 29 2/12000 MON" 将在四年后(即2044年)发生。有人可能会争论说今天制作的几乎所有系统到那时都不再运行。但是那些仍在运行的系统可能需要修复,因此值得考虑在那个日期无意中运行任务的重要性(因为你无法合理地假设有人会记得及时更新它)。这将成为著名的“星期一二月二十九日”错误,那时精通古老C#语言的人将会被支付巨额报酬来修复它。 - youen
顺便说一下,似乎 Hangfire 忽略了 /12000 部分。它只计划在指定的日期“Mon Feb 29”触发。 - youen

7

在Hangfire的更新版本中,您可以简单地使用以下代码:

RecurringJob.AddOrUpdate(() => ..., Cron.Never());

我知道这基本上与上述解决方案相同,但由于我的声望仍然是零,stackoverflow不允许我发表评论...

6

手动或“按需”尚未在主干中实现。但是,您可以使用这个分支来获得该选项。

目前,在Hangfire的存储库中,此功能标为进行中,您可以像这样使用它:

BackgroundJob.Stash(() => Console.WriteLine("STASHING"));

在评论中提到的另一种方法是在您的网站上有一个按钮,用于排队作业:

BackgroundJob.Enqueue(() => Console.WriteLine("Simple!"));

编辑:2017/12/28:

显然,之前的分支不会被合并回来,因为这个扩展已经支持手动排队作业:

Hangfire.Core.Dashboard.Management

enter image description here


3

是的,使用Hangfire可以完全实现按需作业。您可以使用以下方法触发“fire-and-forget”作业:

BackgroundJob.Enqueue(
() => Console.WriteLine("Simple!"));

然而,这不会出现在Hangfire仪表板中,但是您可以在代码中使用上面的片段(也许是在按钮单击之后?)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接