关于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方法。