与BackgroundJib服务器内的Enqueue一起使用时,HangFire Schedule方法不会触发

问题描述 投票:0回答:1

[使用最新版本的 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 方法。我在这里错过了什么吗?

c# windows-services .net-6.0 hangfire in-memory
1个回答
0
投票

添加一行时:

// 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));
}
}
© www.soinside.com 2019 - 2024. All rights reserved.