C# Hangfire并不总是执行重试任务代码,有时会随机将其标记为成功
.NETCore(3.0.0)、Hangfire.AspNetCore(1.7.7)、Hangfire.SqlServer(1.7.7)C# Hangfire并不总是执行重试任务代码,有时会随机将其标记为成功,c#,asp.net-core,hangfire,C#,Asp.net Core,Hangfire,.NETCore(3.0.0)、Hangfire.AspNetCore(1.7.7)、Hangfire.SqlServer(1.7.7) 案例1 我遇到了一个问题,有时hangfire什么也不做(不执行代码),而是将任务标记为成功。找不到一个模式,它是随机发生的,但通常是50/50 //Entry point is .Net Core API [Route("pull-daily")] [HttpPost] public IActionResult PullDaily([FromQuery]
案例1 我遇到了一个问题,有时hangfire什么也不做(不执行代码),而是将任务标记为成功。找不到一个模式,它是随机发生的,但通常是50/50
//Entry point is .Net Core API
[Route("pull-daily")]
[HttpPost]
public IActionResult PullDaily([FromQuery] int hour, int minutes)
{
paymentsService.PullDaily(hour, minutes);
return Ok();
}
internal class PaymentsService : IPaymentsService
{
private readonly IPaymentsProvider _provider;
private readonly IJobManager _jobManager;
public PaymentsService(IPaymentsProvider provider, IJobManager jobManager)
{
_provider = provider;
_jobManager = jobManager;
}
public void PullDaily(int hour, int minute)
{
_jobManager.AddRecurring(
() => _provider.Pull(),
() => Cron.Daily(hour, minute));
}
}
internal class PaymentsProvider : IPaymentsProvider
{
//...
public void Pull()
{
throw new Exception("TEST EX " + DateTime.Now.ToLongTimeString());
}
//...
}
public class JobManager : IJobManager
{
public void AddRecurring(Expression<Action> action, Func<string> cronExpression)
{
handle(() => RecurringJob.AddOrUpdate(action, cronExpression));
}
private void handle(Action action)
{
try
{
action.Invoke();
}
catch (Exception e)
{
//...
}
}
}
伙计们,请帮我找出这里出了什么问题。我无法根据现有代码重现该问题。您在哪里以及如何调用后台作业?您能否共享一个完整的简单演示,它可以重现您的问题,以便我们可以查看和调试代码?入口点是WebAPI。我已添加到描述中。
public class JobManager : IJobManager
{
public void Test()
{
throw new Exception("TEST EX " + DateTime.Now.ToLongTimeString());
}
public void AddRecurring(Expression<Action> action, Func<string> cronExpression)
{
RecurringJob.AddOrUpdate(() => Test(), cronExpression);
}
}
//...
// Add Hangfire services.
services.AddHangfire(config => config
.SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
.UseSimpleAssemblyNameTypeSerializer()
.UseRecommendedSerializerSettings()
.UseSqlServerStorage(Configuration.GetConnectionString("HangfireConnection"), new SqlServerStorageOptions
{
CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
QueuePollInterval = TimeSpan.Zero,
UseRecommendedIsolationLevel = true,
UsePageLocksOnDequeue = true,
DisableGlobalLocks = true
}));
// Add the processing server as IHostedService
services.AddHangfireServer();
//...