Quartz 触发器与作业监听器

监听器是您创建的对象,用于根据调度程序内部发生的事件执行操作。您可以猜到,触发器监听器接收与触发器相关的事件,而作业监听器接收与作业相关的事件。

触发器相关的事件包括:触发器触发、触发器未触发(在本文档的“触发器”部分讨论)以及触发器完成(由触发器触发的作业已完成)。

警告
确保您的触发器和作业监听器永不抛出异常(使用 try-catch)并能处理内部问题。当监听器通知失败时,Quartz 无法确定监听器中的必要逻辑是否成功完成,可能导致作业卡住。

ITriggerListener 接口

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);
}

作业相关的事件包括:即将执行作业的通知以及作业完成执行后的通知。

IJobListener 接口

public interface IJobListener
{
    string Name { get; }
    Task JobToBeExecuted(IJobExecutionContext context);
    Task JobExecutionVetoed(IJobExecutionContext context);
    Task JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException);
}

使用自定义监听器

要创建监听器,只需创建一个实现 ITriggerListener 和/或 IJobListener 接口的对象。然后在运行时将监听器注册到调度器,并必须为其指定一个名称(或者更确切地说,它们需要通过其 Name 属性自宣传名称)。

为了方便起见,您的类也可以扩展 JobListenerSupportTriggerListenerSupport 类,并仅覆盖您感兴趣的事件。

监听器通过调度器的 ListenerManager 进行注册,并附带一个匹配器,该匹配器描述监听器希望接收哪些作业/触发器的事件。

提示
监听器在运行时注册到调度器, 存储在 JobStore 中与作业和触发器一起。这是因为监听器通常是与您的应用程序的集成点。因此,每次应用程序运行时,都需要重新将监听器注册到调度器上。

添加对特定作业感兴趣的 JobListener:

scheduler.ListenerManager.AddJobListener(myJobListener, KeyMatcher<JobKey>.KeyEquals(new JobKey("myJobName", "myJobGroup")));

添加对特定组的所有作业感兴趣的 JobListener:

scheduler.ListenerManager.AddJobListener(myJobListener, GroupMatcher<JobKey>.GroupEquals("myJobGroup"));

添加对两个特定组的所有作业感兴趣的 JobListener:

scheduler.ListenerManager.AddJobListener(myJobListener, OrMatcher<JobKey>.Or(GroupMatcher<JobKey>.GroupEquals("myJobGroup"), GroupMatcher<JobKey>.GroupEquals("yourGroup")));

添加对所有作业感兴趣的 JobListener:

scheduler.ListenerManager.AddJobListener(myJobListener, GroupMatcher<JobKey>.AnyGroup());

大多数 Quartz.NET 用户不使用监听器,但当应用程序需求需要在作业本身未明确通知应用程序的情况下通知事件时,它们非常有用。

在本文档中