You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 04:55:44