Quartzs的job,trriger监听器源码分析

本文深入剖析了QuartzScheduler的源码,重点讲解了如何调度Job和Trigger,包括scheduleJob方法的实现、触发器的校验和存储,以及调度监听器的使用。在调度过程中,Quartz会确保Job和Trigger的正确关联,并通过监听器通知调度状态的变化,如Job的添加和调度。此外,还介绍了内部调度器、监听管理器和信号器的重要角色。
摘要由CSDN通过智能技术生成
在job存储之后,之后做了job添加通知,通知调度器下一刻执行时间,并唤醒正在等在执行的job,然后添加trriger通知。
Java代码   
  1. public class QuartzScheduler  
  2.     implements RemotableQuartzScheduler  
  3. {  
  4.  public Date scheduleJob(JobDetail jobDetail, Trigger trigger)  
  5.         throws SchedulerException  
  6.     {  
  7.         validateState();  
  8.         if(jobDetail == null)  
  9.             throw new SchedulerException("JobDetail cannot be null");  
  10.         if(trigger == null)  
  11.             throw new SchedulerException("Trigger cannot be null");  
  12.         if(jobDetail.getKey() == null)  
  13.             throw new SchedulerException("Job's key cannot be null");  
  14.         if(jobDetail.getJobClass() == null)  
  15.             throw new SchedulerException("Job's class cannot be null");  
  16.     //包装触发器  
  17.         OperableTrigger trig = (OperableTrigger)trigger;  
  18.         if(trigger.getJobKey() == null)  
  19.         //设置触发器jobKey  
  20.             trig.setJobKey(jobDetail.getKey());  
  21.         else  
  22.         if(!trigger.getJobKey().equals(jobDetail.getKey()))  
  23.             throw new SchedulerException("Trigger does not reference given job!");  
  24.         trig.validate();  
  25.         Calendar cal = null;  
  26.         if(trigger.getCalendarName() != null)  
  27.             cal = resources.getJobStore().retrieveCalendar(trigger.getCalendarName());  
  28.         Date ft = trig.computeFirstFireTime(cal);  
  29.         if(ft == null)  
  30.         {  
  31.             throw new SchedulerException((new StringBuilder()).append("Based on configured schedule, the given trigger '").append(trigger.getKey()).append("' will never fire.").toString());  
  32.         } else  
  33.         {  
  34.         //存储job and trriger到jobStrore  
  35.             resources.getJobStore().storeJobAndTrigger(jobDetail, trig);  
  36.         //添加jobDetail到调度监听器  
  37.             notifySchedulerListenersJobAdded(jobDetail);  
  38.             //通知调度器下一刻调度时间  
  39.             notifySchedulerThread(trigger.getNextFireTime().getTime());  
  40.              //添加trigger到调度监听器  
  41.             notifySchedulerListenersSchduled(trigger);  
  42.             return ft;  
  43.         }  
  44.      //添加jobDetail  
  45.      public void notifySchedulerListenersJobAdded(JobDetail jobDetail)  
  46.     {  
  47.         List schedListeners = buildSchedulerListenerList();  
  48.         for(Iterator i$ = schedListeners.iterator(); i$.hasNext();)  
  49.         {  
  50.             SchedulerListener sl = (SchedulerListener)i$.next();  
  51.             try  
  52.             {  
  53.                 sl.jobAdded(jobDetail);  
  54.             }  
  55.             catch(Exception e)  
  56.             {  
  57.                 getLog().error("Error while notifying SchedulerListener of JobAdded.", e);  
  58.             }  
  59.         }  
  60.   
  61.     }  
  62.     //获取调度监听器  
  63.      private List buildSchedulerListenerList()  
  64.     {  
  65.         List allListeners = new LinkedList();  
  66.         allListeners.addAll(getListenerManager().getSchedulerListeners());  
  67.         allListeners.addAll(getInterna
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值