Hangfire定时任务每天在特定时间运行

7

我想每天早上9点运行Hangfire的定时任务。这是我想要做的:

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

这行代码应该放在哪里?

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

4个回答

13
假设您正在使用 .Net Core,您可以在其中找到文件 startup.cs。在其中,您可以找到一个 Configure() 方法。在该方法内部,您可以使用那一行代码,紧接着 app.UseHangfireDashboard()app.UseHangfireServer(),用于配置 Hangfire 仪表板,这是可选的。不要忘记在 startup.cs 中的 ConfigureServices() 方法中注册 Hangfire 服务
您可以在 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 * * *");
}

更多信息请参考链接

更新

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

如果要每天上午9:00创建一个重复的作业,则表达式应为0 9 * * *,请参见cron表达式


谢谢您的回复。不幸的是,我没有使用 .net core。 - s.k.paul
2
请注意,如果您不希望同一作业在不同实例中运行,您应该在添加cron时提供唯一标识符,如下所示:RecurringJob.AddOrUpdate("YOUR_UNIQUE_STRING",() => MyMethod(), "* 9 * * *"); - Farshan
4
在Hangfire中不要忘记每天定时任务的设定。操作方法如下:RecurringJob.AddOrUpdate(() => MyMethod(), Cron.Daily(9,0)); 其中MyMethod()为需要执行的方法,Cron.Daily(9,0)表示在每天早上9点钟开始执行该方法。 - Wlad Neto
1
@WladimirTeixeira 我已经更新了答案,加入了cron表达式。那是我从问题中复制过来没有注意到的错误,对服务器产生了显著的影响。 - Farshan

3
在asp.net中,您可以通过此nugetpackage添加Microsoft.Owin中间件和OwinStartup到您的项目中,并使用startup.cs来设置hangfire。我们总是使用Startup.cs文件的Configuration方法来设置hangfire重复作业:
            public void Configuration(IAppBuilder app) 
            {
                app.UseHangfireDashboard();
                app.UseHangfireServer();
                RecurringJob.AddOrUpdate(19872.ToString(),() => MyMethod(), Cron.Daily(9, 0));
            }

只是给2023年的提示,这已经过时了,请使用:builder.Services.AddHangfireServer(); - Sam

1
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 * * *"

-1
我使用Web API端点来创建任务。我总是为重复的工作提供一个唯一标识符,例如GUID。这样,如果我需要编辑重复的工作时序表达式,并可以通过我的Web API端点更新它。
因此,在Web 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;
            }
        }

你没有展示你的工作选项在这里?实际上,_clientReportJobCreator留下了不完整的代码,请有人来修复。 - c-sharp-and-swiftui-devni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接