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
}
}
我想使用 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
}
}