侦听器是您创建的对象,用于根据调度程序中发生的事件执行操作。 正如您可能猜到的,TriggerListeners 接收与触发器相关的事件,而 JobListeners 接收与作业相关的事件。
与触发器相关的事件包括:触发器触发、触发器错误触发(在本文档的“触发器”部分中讨论)和触发器完成(触发器触发的作业已完成)。
警告
确保您的触发器和作业侦听器永远不会抛出异常(使用 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 属性公布自己的名称。
为了您的方便,您的类也可以扩展 JobListenerSupport
或 TriggerListenerSupport
类,而不是实现这些接口,并简单地覆盖您感兴趣的事件。
侦听器与描述侦听器想要接收事件的作业/触发器的匹配器一起注册到调度程序的 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 用户不使用侦听器,但是当应用程序需要创建事件通知的需要时,侦听器很方便,而 Job 本身没有明确通知应用程序。