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 * * *"
我正尝试在每天上午 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 * * *"