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
相关产品推荐
相关产品推荐

