JobRunShell
上篇博文,博主讲了Listener相关的内容。本篇博文,博主将要详细介绍一下JobRunShell的功能。简单的来说,JobRunShell就是Job实例运行时所在的环境,也就是说在JobRunShell中调用Job接口的execute方法。
Runnable接口
在讲解JobRunShell之前,我们先了解或者加强一下Runnable接口的相关知识。在java编程中,创建Thread一般有三种方式。第一种是定义一个类去继承Thread类,并重写run方法。第二种是在创建Thread的时候,传入对应Runnable方法的实现。第二种是在创建Thread的时候,传入对应FutureTask,FutureTask中含有Callable接口的引用。因此,我们知道需要在线程中运行的对象可以实现Runnable方法。
并且博主的WorkThread博文中就介绍了工作者相关的内容,它会接收ThreadPool线程池给它投递的Runnable实体,因此查看JobRunShell的源码可知,它就是那个被投递的实例对象。
方法定义
通过查看源码可知,JobRunShell具有几个重要的方法,方法如下所示:
//初始化方法
void initialize(QuartzScheduler sched)
throws SchedulerException
//实现了Runnable的接口
void run();
//模板方法,可由子类重写
void begin();
//模板方法,可由子类重写
void complete();
initialize
initialize是JobRunShell的初始化方法。不知道细心的小伙伴有没有方法,对于一些比较重要的对象而言,它都会有initialize方法。spring容器中的@bean注解就可以对应bean的initMethod方法。
该方法逻辑如下:
- 会使用jobFactory实例化出对应jobClass的对象,并且设置这个对象的其它属性。
- 构造出jobExecutionContext接口的实例,该对象会作为参数,在job接口的execute方法中传入。
run
run方法在线程运行的时候被调用,它重写之后的方法逻辑如下:
- 调用begin模板方法,这里使用到了模板方法设计模式。
- 调用对应的trigger监听器triggerFired方法。
- 调用对应的trigger监听器vetoJobExecution方法,判断是否需要拒绝执行。
- 调用对应的job监听器的jobExecutionVetoed方法。
- 会调用job的execute方法,并传入jobExecutionContext实例,同时记录执行时间。
- 调用对应的job监听器的jobWasExecuted方法。
- 调用该trigger的executionComplete方法,得到trigger的完成策略。
- 调用complete模板方法
- 通知jobStoreJob执行完成,调用JobStore的triggeredJobComplete方法。(如tigger没有下次触发时间,就需要删除调trigger)。