美文网首页
quartz框架(六)-ThreadPool

quartz框架(六)-ThreadPool

作者: coderchenhao | 来源:发表于2022-03-16 22:16 被阅读0次

    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)。

    博主微信公众号

    <img src="https://gitee.com/chenhaogit/blogimages/raw/master/xsj/wzgzh-8cm.jpg" style="float:right"/>

    相关文章

      网友评论

          本文标题:quartz框架(六)-ThreadPool

          本文链接:https://www.haomeiwen.com/subject/pnjmdrtx.html