Quartz.NET 事件监听器

news/2024/7/10 5:34:54 标签: .net, quartz

1、调度器监听器

调度器本身收到的一些事件通知,接口ISchedulerListener,如作业的添加、删除、停止、挂起等事件通知,调度器的启动、关闭、出错等事件通知,触发器的暂停、挂起等事件通知,接口部分定义如下:

//添加作业时通知事件
Task JobAdded(IJobDetail jobDetail, CancellationToken cancellationToken = default);
//移除作业时通知事件
Task JobDeleted(JobKey jobKey, CancellationToken cancellationToken = default);
//调度器出错时通知事件
Task SchedulerError(string msg, SchedulerException cause, CancellationToken cancellationToken = default);
//调度器正在关闭时通知事件
Task SchedulerShuttingdown(CancellationToken cancellationToken = default);
//调度器已启动时通知事件
Task SchedulerStarted(CancellationToken cancellationToken = default);
//调度器启动中通知事件
Task SchedulerStarting(CancellationToken cancellationToken = default);

注册方法:scheduler.ListenerManager.AddSchedulerListener(new MySchedulerListener());

MySchedulerListener为具体的调度器实现

2、触发器监听器

对触发器的通知事件监听,接口ITriggerListener,抽象类TriggerListenerSupport,接口定义如下:

public interface ITriggerListener
{
  string Name { get; }
  
  Task TriggerFired(ITrigger trigger, IJobExecutionContext context);
  
  Task<bool> VetoJobExecution(ITrigger trigger, IJobExecutionContext context);
  
  Task TriggerMisfired(ITrigger trigger);
  
  Task TriggerComplete(ITrigger trigger, IJobExecutionContext context, int triggerInstructionCode);
}

3、作业监听器

对Job的通知事件监听,接口IJobListener,抽象类JobListenerSupport,可以通过继承此类实现自定义监听器逻辑,

自定义监听器如下所示,主要是在三个执行方法中分别打印日志信息,观察日志打印顺序,

using Quartz;
using Quartz.Listener;
using System;
using System.Threading;
using System.Threading.Tasks;

namespace QuartzConsole
{
    /// <summary>
    /// Job执行情况监听器
    /// </summary>
    public class MyJobListener : JobListenerSupport
    {
        public override string Name => "MyJobListener";

        public override Task JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException, CancellationToken cancellationToken = default)
        {
            Console.WriteLine($"JobWasExecuted已执行{DateTime.Now.ToLongTimeString()}");
            return base.JobWasExecuted(context, jobException, cancellationToken);
        }

        public override Task JobExecutionVetoed(IJobExecutionContext context, CancellationToken cancellationToken = default)
        {
            Console.WriteLine($"JobExecutionVetoed已执行{DateTime.Now.ToLongTimeString()}");
            return base.JobExecutionVetoed(context, cancellationToken);
        }

        public override Task JobToBeExecuted(IJobExecutionContext context, CancellationToken cancellationToken = default)
        {
            Console.WriteLine($"JobToBeExecuted已执行{DateTime.Now.ToLongTimeString()}");
            return base.JobToBeExecuted(context, cancellationToken);
        }
    }
}

4、定义Job

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

namespace QuartzConsole
{
    public class MyJob : IJob
    {
        public Task Execute(IJobExecutionContext context)
        {
            var mapdata = context.JobDetail.JobDataMap;
            foreach (var item in mapdata)
            {
                Console.WriteLine(item.Key + "," + item.Value);
            }
            Thread.Sleep(7000);//线程延迟7秒后执行
            return Console.Out.WriteLineAsync($"任务开始执行了:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
        }
    }
}

5、创建调度器

创建调度器,并创建Job实例,触发器实例,调度器绑定Job实例和触发器实例,程序主代码如下所示,

using Quartz;
using Quartz.Impl;
using Quartz.Impl.Matchers;
using Quartz.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace QuartzConsole
{
    class Program
    {
        async static Task Main(string[] args)
        {
            StdSchedulerFactory factory = new StdSchedulerFactory();
            var scheduler = await factory.GetScheduler();//创建调度器
            scheduler.ListenerManager.AddJobListener(new MyJobListener(), GroupMatcher<JobKey>.AnyGroup());//注册自定义监听器,对任何组织的job实施监听
            await scheduler.Start();//启动调度器

            var jobdata = new JobDataMap { };
            jobdata.Add("小张", "女孩子");
            jobdata.Add("小潘", 33);
            jobdata.Add("小唐", new DateTime(2019, 8, 6));

            IJobDetail job = JobBuilder.Create<MyJob>()
                .WithIdentity("job1", "group1")
                .DisallowConcurrentExecution(true)//禁止并发执行
                .SetJobData(jobdata)
                .Build();

            #region 简单触发器,每隔5秒重复执行
            ITrigger trigger = TriggerBuilder.Create()
                .WithIdentity("trigger", "group1")
                .WithSimpleSchedule(x=>x.WithInterval(TimeSpan.FromSeconds(5)).RepeatForever())
                .Build();
            #endregion

            await scheduler.ScheduleJob(job, trigger);

            Console.WriteLine("Press any key to close the application");
            Console.ReadKey();
        }
    }
}

6、运行程序

总结:自定义作业监听器注册后,执行顺序为MyJobListener.JobToBeExecuted->Job.Execute->MyJobListener.JobWasExecuted;

Job.DisallowConcurrentExecution(true),true时禁止该job的多个实例并发执行,即使触发器时间已来到下一个执行点,并不会立即触发创建job实例的执行,需要等待前一个job实例执行完成。为false时运行多个实例并发执行。

自建job需要处理好异常,否则事件监听器不会捕捉到事件通知。


http://www.niftyadmin.cn/n/5284447.html

相关文章

VSCode中配置prettier和ESLint

文章目录 了解ESLint和Prettier的作用prettier配置ESLint配置常见问答ESLint 和Prettier 有什么区别&#xff1f;为什么我应该同时使用ESLint 和Prettier&#xff1f;在使用ESLint 和Prettier 时&#xff0c;有可能出现它们之间的规则冲突吗&#xff1f;我已经在项目中使用了ES…

给qemu虚机更换(Windows PE)光盘

1. 背景 qemu虚机里运行windows。如果遇到虚机windows启动故障&#xff0c;甚至连安全模式也故障时&#xff0c;可以尝试更换另一个光驱里的光盘为pe光盘。 2. 步骤 2.1. 找出VDI虚机所在的计算节点 ssh登录之&#xff0c;virsh list获得虚机id&#xff0c;例如 391 1255…

Note: A Horrible Earthquake

A horrible earthquake horrible Dirty water rose in wells and canals before the earthquake. 地震前&#xff0c;水井和河道里污水都涨起来了。 well canals But no one judged that an earthquake was coming. 但是没有人判断出地震就要来临了。 judged Suddenly, eve…

java流浪动物保护系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web 流浪动物保护系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql…

【数据结构】字符串匹配|BF算法|KMP算法|next数组的优化

字符串匹配算法是在实际工程中经常遇到的问题&#xff0c;也是各大公司笔试面试的常考题目&#xff0c;本文主要介绍BF算法&#xff08;最好想到的算法&#xff0c;也最好实现&#xff09;和KMP算法&#xff08;最经典的&#xff09; 一、BF算法 BF算法&#xff0c;即暴力(Bru…

解决 Linux git push 贡献者不同(没有出现绿点)的问题

第一步&#xff0c;通过下面的指令&#xff0c;修改 linux git 的配置文件&#xff1a; vi ~/.gitconfig会进入下图界面&#xff1a; 进入本地&#xff08;Windows&#xff09;中 git 的设置界面 复制 名称 和 Email 到 gitconfig 里&#xff0c;不要在末尾加 &#xff08;空…

Docker在物联网和边缘计算中的应用

物联网&#xff08;IoT&#xff09;和边缘计算&#xff08;Edge Computing&#xff09;是当今科技领域中备受关注的两个领域。它们的兴起为连接设备、传感器和数据提供了新的机会&#xff0c;而Docker容器技术则在这一领域中发挥着重要作用。本文将探讨Docker在物联网和边缘计算…

python的import功能,你需要了解的导入机制

1 基本概念 概念 解释 import 即导入&#xff0c;方式就是在import位置将代码文件拷贝过去。 模块&#xff08;module&#xff09; python中一个.py文件定义为一个模块 常用的几种模块导入方式&#xff1a; import module_nameimport module_name.function_nameimport mod…