日期:2014-05-20  浏览次数:20740 次

关于Spring中使用Quartz的问题?
一句话描述我的问题:Date scheduleJob(JobDetail jobDetail, Trigger trigger)方法内部是如何实现的,如何将Trigger和JobDetail关联起来的?

详细描述:
Job是Quartz中的任务接口,里面有个execute方法。spring提供了对quartz的支持,在sping中提供了QuartzJobBean并实现了Job接口,在该类中对execute方法进行了实现,并且提供了一个抽象方法executeInternal(JobExecutionContext paramJobExecutionContext)供子类去重写。所以我们在spring中写定时任务一般都这么写:
public class ReminderTask extends QuartzJobBean implements StatefulJob
{
  public void init()
  {
  xxxx;
  }

  public void executeInternal(JobExecutionContext context)
  throws JobExecutionException
  {
  //逻辑代码
  }

}

我有两个问题:
1.该类中实现StatefulJob的意图何在?(发问原因,观源码后发现StatefulJob是对Job的空继承,而QuartzJobBean已经做了对Job的实现)

2.在执行定时任务中,我认为比较关键的一句scheduler.scheduleJob(jobDetail, trigger);我想问的是,sceduler是如何管理jobDetail和trigger,为什么会在指定的时间触发器回去执行jobDetail中的executeInternal(xxx)方法,他俩是如何关联的?

新手请教,请大侠们赐教!

------解决方案--------------------
要创建一个作业并能够被触发调用,必须在Scheduler上面注册一个JobDetail和Trigger。
JobDetail 用来保存我们作业的详细信息。
trigger监听器是在scheduler事件发生时能够执行动作的对象。
监听器可以被注册为“全局”的或者“非全局”。“全局”监听器接收所有triggers/jobs产生的事件,
而“非全局”监听器只接受那些通过getTriggerListenerNames() 或 getJobListenerNames()方法显式指定监听器名的triggers/jobs所产生的事件。

正如上面所说的那样,监听器在运行时向scheduler注册,并且不被存储在jobs 和triggers的JobStore中。
Jobs和Trigger只存储了与他们相关的监听器的名字。因此,每次应用运行的时候,都需要向scheduler重新注册监听器。


------解决方案--------------------
深入解读Quartz的原理
http://lavasoft.blog.51cto.com/62575/181907/
------解决方案--------------------
个人认为:jobDetail要指定有对应的任务类,scheduler是通过反身得到任务类的对象,然后定时调用executeInternal方法。