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

Quartz.Net任务完成后触发自定义操作:Job Listener实现示例

Quartz.Net 实现Job Listener监听任务完成并执行自定义操作

1. 创建自定义Job Listener

实现IJobListener接口,核心逻辑在JobWasExecuted方法中——这个方法会在任务执行完成(无论成功或失败)后触发:

using Quartz;
using System.Threading.Tasks;

public class CustomJobCompletionListener : IJobListener
{
    // 监听器唯一标识名称
    public string Name => "CustomJobCompletionListener";

    // 任务即将执行前触发(可选实现)
    public Task JobToBeExecuted(IJobExecutionContext context, CancellationToken cancellationToken = default)
    {
        // 可添加任务执行前的预处理逻辑,比如日志记录
        return Task.CompletedTask;
    }

    // 任务被否决时触发(可选实现)
    public Task JobExecutionVetoed(IJobExecutionContext context, CancellationToken cancellationToken = default)
    {
        return Task.CompletedTask;
    }

    // 任务执行完成后触发,在这里编写自定义操作
    public Task JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException, CancellationToken cancellationToken = default)
    {
        // 获取任务相关信息
        var jobKey = context.JobDetail.Key;
        var executionDuration = context.JobRunTime;

        // 示例:打印任务完成信息
        Console.WriteLine($"任务 [{jobKey.Group}.{jobKey.Name}] 执行完成,耗时:{executionDuration.TotalMilliseconds}ms");

        // 处理任务执行异常(如果有)
        if (jobException != null)
        {
            Console.WriteLine($"任务执行出错:{jobException.Message}");
        }

        // 在这里添加你的自定义业务逻辑
        // 比如:发送通知、更新数据库状态、调用下游服务等
        // await YourPostExecutionLogicAsync();

        return Task.CompletedTask;
    }
}

2. 注册监听器到调度器

将自定义监听器添加到Quartz调度器中,使其生效:

using Quartz;
using Quartz.Impl;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        // 初始化调度器
        var schedulerFactory = new StdSchedulerFactory();
        var scheduler = await schedulerFactory.GetScheduler();

        // 注册自定义监听器
        var jobListener = new CustomJobCompletionListener();
        scheduler.ListenerManager.AddJobListener(jobListener);

        // 可选:仅监听特定组的任务
        // scheduler.ListenerManager.AddJobListener(jobListener, GroupMatcher<JobKey>.GroupEquals("BusinessJobs"));

        // 启动调度器
        await scheduler.Start();

        // 定义测试任务
        var testJob = JobBuilder.Create<SampleBusinessJob>()
            .WithIdentity("SampleJob", "BusinessJobs")
            .Build();

        // 定义触发器(立即执行一次)
        var testTrigger = TriggerBuilder.Create()
            .WithIdentity("SampleTrigger", "BusinessJobs")
            .StartNow()
            .Build();

        // 绑定任务与触发器
        await scheduler.ScheduleJob(testJob, testTrigger);

        // 等待任务执行完成(演示用)
        await Task.Delay(3000);

        // 关闭调度器
        await scheduler.Shutdown();
    }
}

// 示例业务任务
public class SampleBusinessJob : IJob
{
    public async Task Execute(IJobExecutionContext context)
    {
        Console.WriteLine("业务任务开始执行...");
        // 模拟业务逻辑耗时
        await Task.Delay(1500);
        Console.WriteLine("业务任务执行结束");
    }
}

关键说明

  • JobWasExecuted是任务完成后的核心回调点,无论任务成功完成还是抛出异常,都会触发该方法。
  • 通过IJobExecutionContext可以获取任务的所有上下文信息,包括任务参数、执行时间、触发器信息等。
  • 监听器支持按任务组、任务名称等规则进行精准监听,避免全局监听带来的不必要开销。

内容的提问来源于stack exchange,提问作者Ali jafari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 11:23:18