C# Hangfire并不总是执行重试任务代码,有时会随机将其标记为成功

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]

.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] 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();
//...