Hangfire 每天在特定时间重复工作

Hangfire recurring job daily on specific time

我正尝试在每天上午 9 点 运行 hangfire 重复作业。这是我想做的-

RecurringJob.AddOrUpdate(() => MyMethod(), "* 9 * * *");

这行代码应该放在哪里?

抱歉,如果这是一个愚蠢的问题。

假设您正在使用 .Net Core,您可以在其中找到文件 startup.cs。在那里你可以找到一个 Configure() 方法。在该方法中,您可以在 app.UseHangfireDashboard()app.UseHangfireServer() 之后使用那一行,用于配置 hangfire 仪表板,这是可选的。不要忘记在 ConfigureServices() 方法中 Register Hangfire Services,可以在 startup.cs 本身中找到。

您可以在 Startup.cs

ConfigureServices() 注册 Hangfire 服务
    public void ConfigureServices(IServiceCollection services)
    {    
    /*
    other services
    */

    services.AddHangfire(x => x.UseSqlServerStorage("YOUR_HangfireServerConnectionString"));

    /*
    services.AddMvc()
    */
    }

您可以在 Startup.cs

Configure() 设置 Hangfire Cron
public void Configure(IApplicationBuilder app)
{
    app.UseHangfireDashboard();  
    app.UseHangfireServer();
    RecurringJob.AddOrUpdate(() => MyMethod(), "* 9 * * *");
}

有关更多信息,请参阅 link

更新

cron 表达式 * 9 * * * 表示作业将在 系统时间 UTC 时间的 9(24 小时制)后每分钟触发一次。

要在每天上午 9 点创建循环作业,表达式应为 0 9 * * * 参考此处 cron expressions

我使用网络 api 端点来创建作业。我总是给经常性的工作一个唯一的标识符,比如 guid。这样,如果我需要编辑重复作业 chron 表达式并可以通过我的网络 api 端点更新它。

所以在网络上 api 我有 :-

[HttpPost]
[Microsoft.AspNetCore.Mvc.Route("daily")]
public IActionResult AddOrUpdateDailyReportJob([FromBody]JobOptions options)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    var result = _clientReportJobCreator.AddOrUpdateDailyClientReport(options.JobId, options.ChronExpression);

    return Ok(result);
}

还有像这样的服务方法,可以添加或更新现有的重复作业。

 public JobCreationResult AddOrUpdateDailyClientReport(string jobId, string chronExpression)
        {
            try
            {
                RecurringJob.AddOrUpdate(jobId, () => _clientDailyReportService.Run(), chronExpression);

                var result = new JobCreationResult
                {
                    JobId = jobId,
                    Success = true
                };

                return result;
            }
            catch (Exception ex)
            {
                var result = new JobCreationResult
                {
                    JobId = jobId,
                    Success = false,
                    Errors = new List<string>()
                    {
                        $"{ex.Message}"
                    }
                };

                return result;
            }
        }

在asp.net中,您可以通过此nugetpackage将Microsoft.Owin中间件和OwinStartup添加到您的项目中,然后使用startup.cs设置hangfire。对于 hangfire 重复作业,我们总是使用 Startup.cs 文件的配置方法:

            public void Configuration(IAppBuilder app) 
            {
                app.UseHangfireDashboard();
                app.UseHangfireServer();
                RecurringJob.AddOrUpdate(19872.ToString(),() => MyMethod(), Cron.Daily(9, 0));
            }
RecurringJob.AddOrUpdate(() => homeCtrl.SendEmail(), Cron.Daily(hour,minute), TimeZoneInfo.Local);

没有TimeZoneInfo.Local它将使用默认的UTC时间。您必须始终使用 TimeZoneInfo.Local 得到你的确切时间。

        var corn = Cron.Daily();    // "0 0 * * *"  Every night at 12:00 AM

        var corn1 = Cron.Daily(11, 30);   // "30 11 * * *"

        var corn2 = Cron.Daily(12);   // "0 12 * * *"

        var corn3 = Cron.Daily(23,55);  // "55 23 * * *"