Quartz调度器多任务单独启停及挂起任务重启方案咨询
Quartz 多任务配置问题解决方案
一、故障任务自动重启实现
针对API调用导致任务挂起终止的场景,可通过以下两种方式实现自动重试:
1. 任务内异常捕获触发重试
在Job的Execute方法中捕获API异常,通过JobExecutionException控制重试逻辑:
public class FirstJob : IJob { public async Task Execute(IJobExecutionContext context) { try { await CallDataSourceApi(); } catch (Exception ex) { Console.WriteLine($"任务执行失败: {ex.Message}"); var retryException = new JobExecutionException(ex); // 读取当前重试次数 int retryCount = context.JobDetail.JobDataMap.GetIntValue("RetryCount"); if (retryCount >= 3) { retryException.UnscheduleAllTriggers = true; // 重试耗尽后停止触发 } else { context.JobDetail.JobDataMap.Put("RetryCount", retryCount + 1); retryException.RefireImmediately = true; // 立即重试 } throw retryException; } } private async Task CallDataSourceApi() { // 实际API调用逻辑 } }
配置Job时初始化重试计数:
IJobDetail firstJob = JobBuilder.Create<FirstJob>() .WithIdentity("firstJob") .UsingJobData("RetryCount", 0) .Build();
2. Trigger层面配置重试策略
直接在Trigger中定义失败后的重试规则:
ITrigger firstTrigger = TriggerBuilder.Create() .WithIdentity("firstTrigger") .StartNow() .WithCronSchedule("0 * 8-22 * * ?") .WithSimpleSchedule(s => s.WithIntervalInSeconds(5).RepeatCount(3)) // 5秒重试一次,最多3次 .Build();
二、单个任务独立启停控制
放弃全局Scheduler.Start()/Scheduler.Stop(),通过任务/Trigger的Identity单独操作:
1. 暂停/恢复任务
// 暂停指定任务(关联Trigger全部暂停) Scheduler.PauseJob(new JobKey("firstJob")); // 恢复指定任务 Scheduler.ResumeJob(new JobKey("firstJob"));
2. 暂停/恢复单个Trigger
// 暂停特定Trigger Scheduler.PauseTrigger(new TriggerKey("firstTrigger")); // 恢复特定Trigger Scheduler.ResumeTrigger(new TriggerKey("firstTrigger"));
3. 启停单个任务示例
// 立即触发一次任务 Scheduler.TriggerJob(new JobKey("firstJob")); // 停止任务(暂停Trigger) Scheduler.PauseTrigger(new TriggerKey("firstTrigger")); // 彻底移除任务触发(需重新调度才能恢复) Scheduler.UnscheduleJob(new TriggerKey("firstTrigger"));
注意:全局Scheduler需处于启动状态(先调用
Scheduler.Start()),才能单独控制任务启停。
内容的提问来源于stack exchange,提问作者MrMustafa022
相关产品推荐
相关产品推荐

