zoukankan      html  css  js  c++  java
  • QUARTZ系列之二-监听器

    Listener

    1.是什么: perform actions based on events occurring within the scheduler.

    2.分类:a.TriggerListeners ; b.JobListeners ; c.SchedulerListeners 

    TriggerListener

    1. 处理与trigger相关的事件,包括: trigger firings, trigger mis-firings , and trigger completions (the jobs fired off by the trigger is finished).

    2. 接口定义:

    public interface TriggerListener {
       // 获取监听器的名称
        public String getName();
       // 1.Called by the Scheduler when a Trigger has fired,
       // 2.before it's associated org.quartz.JobDetail is executed.
       // 3.called before the vetoJobExecution(..)method
       public void triggerFired(Trigger trigger, JobExecutionContext context);
        // 1.如果返回true,将veto关联JobDetail的执行;
      // 2. 在triggerFired()方法之后执行
    public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context);  
       // 1. 当trigger misfired之后执行此方法
    // 2. 需要注意的是:本方法的耗时需要被关注,因为如果耗时太长,那么当有大量triggers同时misfire时,将会出现问题
    public void triggerMisfired(Trigger trigger);
    // 1. jobDetail
    public void triggerComplete(Trigger trigger, JobExecutionContext context, int triggerInstructionCode); }

    3. 内置实现:内置实现有俩个,一个是TriggerListenerSupport抽象类,只需要实现getName()指定名称,别的方法都是空的,实现需要实现的即可。

    另一个是BroadcastTriggerListener,这个类又是另外一个作用了,相当于一个代理吧,内部有一个TriggerListener实例的集合,当有事件通知时,广播给内部的listeners。主要代码如下:

        private List<TriggerListener> listeners;
      // 内部通过循环进行请求的分发,这样就只需要这个listener与trigger关联了
        public void triggerFired(Trigger trigger, JobExecutionContext context) {
    
            Iterator<TriggerListener> itr = listeners.iterator();
            while(itr.hasNext()) {
                TriggerListener l = itr.next();
                l.triggerFired(trigger, context);
            }
        }

     JobListener 

    1. 处理与job有关的事件,包括:the job is about to be executed, and  the job has completed execution.

    2. 接口定义:

    public interface JobListener {
    
        public String getName();
        // 1.JobDetail即将执行时触发
        // 2.如果job被vetoed了,此方法不会执行
        public void jobToBeExecuted(JobExecutionContext context);
        // 触发时机:JobDetail即将执行,但是TriggerListener  veto 了该执行时会触发此方法
        public void jobExecutionVetoed(JobExecutionContext context);
    
        public void jobWasExecuted(JobExecutionContext context,
                JobExecutionException jobException);
    
    }

    3. 实现:与trigerListener类似,

    方法的触发顺序:

    triggerFired
    jobToBeExecuted
    job executing。。。
    jobWasExecuted
    triggerComplete

    SchedulerListener:

    1. 监听scheduler的相关事件,包括job/trigger的新增移除,执行期间的报错以及scheduler的关闭。

    2. 接口定义

    public interface SchedulerListener {
        // 当一个JobDetail被scheduled时。
        public void jobScheduled(Trigger trigger);
    
        public void jobUnscheduled(String triggerName, String triggerGroup);
    
        public void triggerFinalized(Trigger trigger);
    
        public void triggersPaused(String triggerName, String triggerGroup);
    
        public void triggersResumed(String triggerName, String triggerGroup);
    
        public void jobsPaused(String jobName, String jobGroup);
    
        public void jobsResumed(String jobName, String jobGroup);
    
        public void schedulerError(String msg, SchedulerException cause);
    
        public void schedulerStarted();
    
        public void schedulerInStandbyMode();
    
        public void schedulerShutdown();
    
        public void schedulingDataCleared();
    }

    使用Listener:

    1.名字必须有;2.可以继承support类,不必实现接口实现不需要的方法。

    1.通过scheduler的ListenerManager 对象注册在scheduler上,随带着一个Matcher,用来指示listener监听的是那个trigger/job

     代码示意如下;

    scheduler.getListenerManager().addJobListener(myJobListener, KeyMatcher.jobKeyEquals(new JobKey("myJobName", "myJobGroup")));

    Matcher接口方法如下:

    public interface Matcher<T extends Key<?>> extends Serializable {
    
        boolean isMatch(T key);
     
        public int hashCode();
    
        public boolean equals(Object obj);
    }

    Matcher的类型很多,可以根据自己的需要灵活应用:EverythingMatcher,GroupMatcher,KeyMatcher,NameMatcher,  AndMatcher,  NotMatcher,  OrMatcher。这些都可以通过静态方法执行使用,如果有自定义的需求,quartz还提供了StringMatcher抽象类,具体不再赘述。

  • 相关阅读:
    MySQL5.7初始密码查看及重置
    ps top kill
    Linux基础知识[2]【延迟及定时机制】
    大数加减运算
    字符串分隔
    打印NxN的矩阵
    交叉排序
    去除重复字符并排序
    大数求差——(华为实习招聘机试题)
    图解TCP-IP协议
  • 原文地址:https://www.cnblogs.com/po-shi/p/10215657.html
Copyright © 2011-2022 走看看