Hangfire在一分钟内重复执行任务

Rob*_*ert 21 .net c# hangfire

有没有办法每隔几秒设置一次篝火重复工作?我不寻求一个解决方案,即火灾和忘记任务会产生另一个火灾和忘记任务,如果没有,建议的替代方案是什么?

Pat*_*lan 27

我认为任何反对允许重复触发不到1分钟的人都是短视的.毕竟,55秒的效率是否低于1分钟?看起来很武断!尽管我喜欢Hangfire,但我遇到的情况是我不得不将客户端引导到Quartz.net,因为业务需要每55秒运行一次或类似.

任何提出反驳论点的人,如果它被配置为每1秒运行一次就会对性能产生严重影响,那么再次对事物采取封闭的看法.当然,间隔1秒的触发器可能不是一个好主意,但是对于不太可能出现1秒钟的情况,我们是否会放弃55秒或45秒?

在任何情况下,性能都是主观的并且取决于主机平台和硬件.在性能方面,实际上不需要API来强制执行意见.只需使轮询间隔和触发重复可配置.这样,用户可以为自己确定最佳结果.

虽然可以选择将作业编排为每55秒运行一次的后台处理,但这并不十分令人满意.在这种情况下,通过Hangfire UI无法看到该过程,因此它对管理员是隐藏的.我觉得这种做法正在绕开Hangfire的主要好处之一.

如果Hangfire是Quartz.net之类的重要竞争者,它至少会匹配他们的基本功能.如果Quartz可以支持间隔低于1分钟的触发器而不是为什么不能Hangfire!


Ale*_*xei 16

不知道何时支持该功能,但在带有Hangfire 1.7.0的ASP.NET Core 2.0中尝试了此功能。以下代码每20秒调度一次作业:

RecurringJob.AddOrUpdate<SomeJob>(
    x => x.DoWork(),
    "*/20 * * * * *");
Run Code Online (Sandbox Code Playgroud)

如果我没有记错的,由于Hangfire使用了NCrontab,因此支持6个标记(而不是标准的5个标记),它允许cron表达式使用6个标记(第二个粒度而不是分钟粒度)。

Hangfire仪表板还很好地显示了运行之间的较小时间间隔:

Hangfire仪表板

  • 如果您需要运行少于 15 秒,请设置“SchedulePollingInterval”,正如 takaz 指出的那样。 (4认同)
  • 是的,正在工作。几分钟即可运行 (3认同)
  • 看起来是在1.7或更高版本中添加的。好东西!! (2认同)

小智 9

尽管Hangfire不允许您在不到一分钟的时间内安排任务,但实际上您可以通过让函数递归地安排自身来实现此目的;也就是说,假设您希望每隔2秒点击某个方法,您可以安排一个后台作业,在启动时调用该方法;

BackgroundJob.Schedule(() => PublishMessage(), TimeSpan.FromMilliseconds(2000));
Run Code Online (Sandbox Code Playgroud)

然后在PublishMessage方法中进行操作,然后安排作业以调用相同的方法;

public void PublishMessage()
    {
        /* do your stuff */

        //then schedule a job to exec the same method
        BackgroundJob.Schedule(() => PublishMessage(), TimeSpan.FromMilliseconds(2000));
    }
Run Code Online (Sandbox Code Playgroud)

您需要重写的另一件事是默认的SchedulePollingInterval 15s,否则,您的方法将仅在每15s之后被命中一次。为此,只需在启动时将BackgroundJobServerOptions实例传递给UseHangfireServer即可,就像这样;

var options = new BackgroundJobServerOptions
        {
            SchedulePollingInterval = TimeSpan.FromMilliseconds(2000)
        };

        app.UseHangfireServer(options);
Run Code Online (Sandbox Code Playgroud)

我不知道我的解决方案有多么“万无一失”,但是我设法实现了它的目标,并且在生产中一切都“令人满意”。


WtF*_*dgE 5

我必须做同样的事情,但需要 5 秒。默认计划轮询间隔设置为 15 秒。所以它需要2个步骤才能实现5s的间隔作业。

在 Startup.cs

var options = new BackgroundJobServerOptions
{
    SchedulePollingInterval = TimeSpan.FromMilliseconds(5000)
};

app.UseHangfireDashboard();
app.UseHangfireServer(options);
Run Code Online (Sandbox Code Playgroud)

你的工作

RecurringJob.AddOrUpdate(() => YourJob(), "*/5 * * * * *");
Run Code Online (Sandbox Code Playgroud)