quartz框架(九)-JobRunShell

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

该方法逻辑如下:

  1. 会使用jobFactory实例化出对应jobClass的对象,并且设置这个对象的其它属性。
  2. 构造出jobExecutionContext接口的实例,该对象会作为参数,在job接口的execute方法中传入。

run

run方法在线程运行的时候被调用,它重写之后的方法逻辑如下:

  1. 调用begin模板方法,这里使用到了模板方法设计模式。
  2. 调用对应的trigger监听器triggerFired方法。
  3. 调用对应的trigger监听器vetoJobExecution方法,判断是否需要拒绝执行。
  4. 调用对应的job监听器的jobExecutionVetoed方法。
  5. 会调用job的execute方法,并传入jobExecutionContext实例,同时记录执行时间。
  6. 调用对应的job监听器的jobWasExecuted方法。
  7. 调用该trigger的executionComplete方法,得到trigger的完成策略。
  8. 调用complete模板方法
  9. 通知jobStoreJob执行完成,调用JobStore的triggeredJobComplete方法。(如tigger没有下次触发时间,就需要删除调trigger)。

博主微信公众号

posted on 2022-03-16 22:15  幕友皎敖奔乾  阅读(129)  评论(0编辑  收藏  举报

导航