侦听器是您创建的对象,用于根据调度程序中发生的事件执行操作。 正如您可能猜到的,TriggerListeners 接收与触发器相关的事件,而 JobListeners 接收与作业相关的事件。

与触发器相关的事件包括:触发器触发、触发器错误触发(在本文档的“触发器”部分中讨论)和触发器完成(触发器触发的作业已完成)。

警告

确保您的触发器和作业侦听器永远不会抛出异常(使用 try-catch)并且它们可以处理内部问题。 当侦听器通知失败时,Quartz 无法确定侦听器中所需的逻辑是否成功完成后,作业可能会卡住。

ITriggerListener 接口

  1. public interface ITriggerListener
  2. {
  3. string Name { get; }
  4. Task TriggerFired(ITrigger trigger, IJobExecutionContext context);
  5. Task<bool> VetoJobExecution(ITrigger trigger, IJobExecutionContext context);
  6. Task TriggerMisfired(ITrigger trigger);
  7. Task TriggerComplete(ITrigger trigger, IJobExecutionContext context, int triggerInstructionCode);
  8. }

作业相关事件包括:作业即将执行的通知,作业执行完毕的通知。

IJobListener 接口

  1. public interface IJobListener
  2. {
  3. string Name { get; }
  4. Task JobToBeExecuted(IJobExecutionContext context);
  5. Task JobExecutionVetoed(IJobExecutionContext context);
  6. Task JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException);
  7. }

使用你自己的侦听器

要创建侦听器,只需创建一个实现 ITriggerListener 和/或 IJobListener 接口的对象。 监听器然后在运行时向调度程序注册,并且必须被赋予一个名称(或者更确切地说,它们必须通过其 Name 属性公布自己的名称。

为了您的方便,您的类也可以扩展 JobListenerSupportTriggerListenerSupport 类,而不是实现这些接口,并简单地覆盖您感兴趣的事件。

侦听器与描述侦听器想要接收事件的作业/触发器的匹配器一起注册到调度程序的 ListenerManager 中。

提示

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

添加一个对特定工作感兴趣的 JobListener:

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

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

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

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

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

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

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

大多数 Quartz.NET 用户不使用侦听器,但是当应用程序需要创建事件通知的需要时,侦听器很方便,而 Job 本身没有明确通知应用程序。