【问题标题】:.NET Core Quartz retry job on exception.NET Core Quartz 异常重试作业
【发布时间】:2021-10-07 10:36:23
【问题描述】:

我有一个带有 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;
    }
}

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

【问题讨论】:

    标签: c# .net-core service-worker quartz-scheduler quartz


    【解决方案1】:

    我在这里找到了一些有用的信息: Refire quartz.net trigger after 15 minutes if job fails 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多