c# - .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 方法。
解决方案
我在这里找到了一些有用的信息: 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;
}
推荐阅读
- python - 我的 PySide2 脚本中的这个语法错误来自哪里?
- excel - 如何编辑 VBA 代码以粘贴到不同的位置
- mysql - Is JOIN operation ddl?
- android - Android 上 FloatingActionButton 图像的动画变化
- python - 如何将我的 Python 反向 shell 与不在本地网络中的电脑连接
- r - ggplot2如何使散点图上的水平和垂直误差条大小相同,轴的比例不同
- c - C 程序命令提示符在 if 语句内关闭,而不是在 main() 末尾暂停
- javascript - 输入文本上的 Javascript 文本输入将格式更改为小数点后两位
- html - 在 Firefox 中光标离开列表时选择关闭下拉菜单
- css - z-index 不适用于我的下拉菜单