首页 > 解决方案 > .NET Core Quartz 异常重试作业

问题描述

我有一个带有 Quartz 的 .NET 5 worker 服务,并且我准备了一份每天在特定时间执行的工作。Execute(IJobExecutionContext context)但是,在作业方法中发生了异常。而且由于我刚刚throw;在方法中放了一个,服务继续正常工作,但没有重新触发工作。

程序.cs:

services.AddQuartz(properties, options =>
{
    options.UseMicrosoftDependencyInjectionScopedJobFactory();
});
services.AddQuartzHostedService(q => q.WaitForJobsToComplete = true);

DailyJob.cs:

[DisallowConcurrentExecution]
public class DailyJob: IJob
{
    private readonly ILogger<DailyJob> _logger

    public DailyJob(
        ILogger<DailyJob> logger
        )
    {
        _logger = logger;
    }

    public Task Execute(IJobExecutionContext context)
    {
        try
        {
            // DoStuff
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, ex.Message);
            throw;
        }

        return Task.CompletedTask;
    }
}

现在,我的问题是我是否可以通过立即重新解雇工作来避免这种情况?我已经看到了JobExecutionException带有参数的类型bool refireImmediately,但是如果我抛出那个异常,它会做任何事情吗?它仍然是一个例外,我正在抛出 Execute 方法。

标签: c#.net-coreservice-workerquartz-schedulerquartz

解决方案


我在这里找到了一些有用的信息: Refire quartz.net trigger after 15 minutes if job failed with exception

应该是这样的:

public Task Execute(IJobExecutionContext context)
{
    try
    {
        // DoStuff
    }
    catch (Exception ex)
    {
        _logger.LogError(ex, ex.Message);
        
        SimpleTriggerImpl retryTrigger = new SimpleTriggerImpl(Guid.NewGuid().ToString());      
        retryTrigger.Description = "RetryTrigger";
        retryTrigger.RepeatCount = 0;
        retryTrigger.JobKey = context.JobDetail.Key;   // connect trigger with current job      
        retryTrigger.StartTimeUtc = DateBuilder.NextGivenSecondDate(DateTime.Now, 30);  // Execute after 30 seconds from now
        context.Scheduler.ScheduleJob(retryTrigger);   // schedule the trigger

        JobExecutionException jex = new JobExecutionException(ex, false);
        throw jex;
    }

    return Task.CompletedTask;
}

推荐阅读