[使用最新版本的 HangFire Nuget 包]
我在 .NET 6 中创建了一项服务来处理一项玉米工作。我需要立即执行一个方法,并安排它在几个小时后再次执行,以根据用户数据处理一些业务操作。
按照 Program.cs 中的指示,我已注册 HangFireService 以使用 InMemoryStorage(因为我们的服务将始终处于活动状态)与 HangFireServer 一起使用,如下所示,
builder.Services.AddHangfire(configuration => configuration.UseInMemoryStorage());
// Add the processing server as IHostedService
builder.Services.AddHangfireServer();
在服务文件中,我在执行异步方法中有以下代码行
using(var server = new BackgroundJobServer()){
BackgroundJob.Enqueue(
() => _logger.LogInformation("Fire-and-forget!"));
BackgroundJob.Schedule(
() => _logger.LogInformation("Delayed!"),
TimeSpan.FromHours(7));
}
当服务运行时,第一个 LogInformation 立即执行并能够在日志文件中看到消息。但尽管如此,时间表还是不起作用 Jobid 正在创建,服务仍在运行。
在分析日志时,发现 HangFire 日志显示后台作业服务器在创建计划作业后立即关闭。我尝试添加将关闭时间限制属性设置为 7 小时的选项。但没有运气。
根据 poc,我需要立即执行一个 corn 方法,并稍后安排相同的 corn 方法。我在这里错过了什么吗?
添加一行时:
// Add the processing server as IHostedService
builder.Services.AddHangfireServer();
这会将
BackgroundJobServerHostedService
注册为 IHostedService
。您不需要创建 BackgroundJobServer
的新实例来将作业排入队列。
BackgroundJobServerHostedService
创建一个 BackgroundJobServer
并让它运行选项、存储信息等。要触发作业,您只需调用:
BackgroundJob.Enqueue(
() => _logger.LogInformation("Fire-and-forget!"));
BackgroundJob.Schedule(
() => _logger.LogInformation("Delayed!"),
TimeSpan.FromHours(7));
或者你可以注射
IBackgroundJobClient
:
public class Foo : IFoo
{
private IBackgroundJobClient _backgroundJobClient { get; set; }
private ILogger<Foo> _logger {get;set;}
public Foo(IBackgroundJobClient backgroundJobClient,
ILogger<Foo> logger)
{
_backgroundJobClient = backgroundJobClient;
_logger = logger;
}
public Do()
{
_backgroundJobClient.Enqueue(() => _logger.LogInformation("Fire-and-forget!"));
_backgroundJobClient.Schedule(
() => _logger.LogInformation("Delayed!"),
TimeSpan.FromHours(7));
}
}