program.cs中加入代码
//任务写入redis的配置
var HangfireConnectionString = ConfigurationHelper.GetSettings("Hangfire:ConnectionString");
var HangfireDb = ConfigurationHelper.GetSettings("Hangfire:Db");
//Attempts 为任务重试次数 OnAttemptsExceeded 为任务全部处理失败后将任务置为什么状态
GlobalJobFilters.Filters.Add(new AutomaticRetryAttribute { Attempts = 10, DelaysInSeconds = new[] { 1 } , OnAttemptsExceeded = AttemptsExceededAction.Fail});
builder.Services.AddHangfire(config => config.UseRedisStorage(HangfireConnectionString, new RedisStorageOptions
{
Db = int.Parse(HangfireDb),
//多久读取一次,最低15秒
FetchTimeout = TimeSpan.FromSeconds(15)
}));
builder.Services.AddHangfireServer();
执行后台延时任务
TimeSpan delay = TimeSpan.FromSeconds(10);
//延时10秒执行任务
var id = BackgroundJob.Schedule(() => RunTest(), delay);
//任务执行完毕后取返回值处理逻辑
BackgroundJob.ContinueJobWith(id, () => CheckResult(id));
public void CheckResult(string jobId)
{
var result = JobStorage.Current.GetMonitoringApi().JobDetails(jobId);
Console.WriteLine(result.Serialize());
}
如果要用到失败重试机制,或使用递归,要在program里面注入自己这个类
builder.Services.AddScoped<IPurchaseOrderBiz, PurchaseOrderBiz>();
//从redis获取重试次数
private async Task BackgroundJobTaskAsync(Push_Order_Data post)
{
var count = await FreeRedisManageData.GetRedisOrderRetryCountAsync(post.shop_platform, post.order_id, _serviceName);
if (count != -1 && count < retryCount)
{
if (await FreeRedisManageData.SetRedisOrderRetryCountAsync(post.shop_platform, post.order_id, _serviceName, count + 1))
{
TimeSpan delay = TimeSpan.FromSeconds(delayMinutes);
var jobid = BackgroundJob.Schedule(() => OrderServiceDeal(post), delay);
//延时任务执行成功后执行的操作
//BackgroundJob.ContinueJobWith(jobid, () => Application.GetProviderService<IPurchaseOrderBiz>().CheckResult(jobid));
//Console.WriteLine($"{DateTime.Now.ToString("G")} 延时任务ID:{jobid}");
}
}
else
{
await FreeRedisManageData.DelRedisOrderRetryCountAsync(post.shop_platform, post.order_id, _serviceName);
Console.WriteLine($"{post.order_id} [自动采购任务]已达最大失败重试次数");
//BackgroundJob.Delete(jobid)
}
}
/// <summary>
/// 判断任务返回的数据
/// </summary>
/// <param name="jobId"></param>
public void CheckResult(string jobId)
{
//获取任务执行结果
var jobResult = JobStorage.Current.GetMonitoringApi().JobDetails(jobId);
var succeeded = jobResult?.History.FirstOrDefault(a=>a.StateName.EqualsStrings("Succeeded"));
if (succeeded != null && succeeded.Data.TryGetValue("Result", out string result))
{
var apiResult = result.Deserialize<ApiResult>();
if (apiResult != null && apiResult.code == (int)ReturnCode.Exception)
{
//自己我逻辑,是否重试
var delay = TimeSpan.FromMinutes(delayMinutes);
//可以不重新获取服务
var jobid = BackgroundJob.Schedule(() => Application.GetProviderService<IPurchaseOrderBiz>().OrderServiceDeal(null), delay);
BackgroundJob.ContinueJobWith(jobid, () => Application.GetProviderService<IPurchaseOrderBiz>().CheckResult(jobid));
}
}
}
asp.net core程序没有添加仪表盘配置将有可能报错:Current JobStorage instance has not been initialized yet
在program中加入
var app = builder.Build();
app.UseHangfireDashboard("/hangfire", new DashboardOptions
{
...
});