Hangfire 坚持本地范围

Hangfire persist local scope

我想使用 Hangfire 创建长时间的 运行ning fire and forget 任务。如果 Web 服务器死机并重试后台作业,我希望它从停止的地方继续。

在下面的示例中,假设 foo.RetryCount 达到 3 -> 服务器重新启动 -> Hangfire 重新 运行 完成作业。在这种情况下,我只想 运行 任务再执行 7 次(基于 MaxAttemps),而不是从零开始。

我以为 Hangfire 将传递给方法的参数保持在当前状态,但据我所知,它们已被重置。

var foo = new Foo { RetryCount = 0, MaxAttemps = 10 };
BackgroundJob.Enqueue(() => RequestAndRetryOnFailure(foo));

void RequestAndRetryOnFailure(Foo foo) 
{
    // make request to server, if fail, wait for a 
    // while and try again later if not foo.MaxAttemps is reached
    foo.RetryCount++;
}

我将 hangfire 广泛用于许多不同的操作,并且经常需要重新安排已启动但由于某些限制而无法执行的作业。

您所指的持久性发生在作业的序列化版本中,该作业已入队但一旦执行就不再保留。

我建议的是,如果服务器不可用,请安排作业在一定数量后执行。如果作业已安排并且 hangfire 重新启动,这也将有助于重新启动作业。

var foo = new Foo { RetryCount = 0, MaxAttemps = 10 };
BackgroundJob.Enqueue(() => RequestAndRetryOnFailure(foo));

void RequestAndRetryOnFailure(Foo foo) 
{
    // make request to server, if fail, wait for a 
    // while and try again later if not foo.MaxAttemps is reached
    if (request to server failed) 
    {
        foo.RetryCount ++;
        If (foo.RetryCount < foo.MaxAttempts)
            BackgroundJob.Schedule(RequestAndRetryOnFailure(foo), Timespan.FromSeconds(30));
        else
             return; // do nothing
    }
}