Quartz作业调度基本使用详解

 更新时间:2022年08月31日 15:05:48   作者:石头耳东  
这篇文章主要为大家介绍了Quartz作业调度基本使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

Quartz核心概念

实际业务开发中会遇到定时任务的情形,这种时候可以使用Quartz来帮助我们便捷地完成。

① Job

Job表示一个工作(任务),需要执行的具体内容。开发中我们可以通过实现Job接口,来指定我们具体要执行的工作。不过也可以直接写一个类,Spring会帮助我们做具体的注入。

public interface Job {
    void execute(JobExecutionContext context)
        throws JobExecutionException;
}

当然我们可以使用Spring配置将Job注入容器,如下:

<bean id="helloJob" class="com.example.jobs.HelloJob"/>

② JobDetail

JobDetail表示一个具体的可执行的调度程序,Job 是这个可执行程调度程序所要执行的内容。我们需要通过JobDetail来对Job进行绑定,具体如下:

  JobDetail job = newJob(HelloJob.class)
      .withIdentity("helloJob", "group1") 
      .build();

当然我们也可以通过配置Spring将其注入到应用容器当中,如下:

    <bean id="jobDetail"
          class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <!-- 注入目标对象 -->
        <property name="targetObject" ref="helloJob"/>
        <!-- 注入目标方法 -->
        <property name="targetMethod" value="sayHello"/>
    </bean>

③ TriggerTrigger定义执行给定作业的计划的组件。

  Trigger trigger = newTrigger()
      .withIdentity("myTrigger", "group1")
      .startNow()
      .withSchedule(simpleSchedule()
          .withIntervalInSeconds(40)
          .repeatForever())            
      .build();

在Spring配置中继续注册我们的触发器,如下:

    <bean id="myTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <!-- 注入JobDetail -->
        <property name="jobDetail" ref="jobDetail"/>
        <!-- 指定触发的时间,基于Cron表达式 -->
        <property name="cronExpression">
            <!--<value>0 0 2 * * ?</value>-->
            <value>0/10 * * * * ?</value>
        </property>
    </bean>

④ SchedulerScheduler代表一个调度容器,一个调度容器中可以注册多个 JobDetail 和 Trigger。

        //注册trigger并启动scheduler
        scheduler.scheduleJob(job,trigger);
        scheduler.start();

在Spring中我们也使用对应的FactoryBean来完成注册,如下:

    <!-- 注册一个统一的调度工厂,通过这个调度工厂调度任务 -->
    <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <!-- 注入多个触发器 -->
        <property name="triggers">
            <list>
                <ref bean="myTrigger"/>
            </list>
        </property>
    </bean>

Quartz结合Spring使用的一些细节

autoStartup自动启动

通过观察代码,我们不难发现在编码中我们手动去启动了scheduler,如下:

        scheduler.start();

而在Spring中,我们使用了SchedulerFactoryBean,工厂Bean来完成scheduler对象的注入。我们并没有显示地去获取scheduler对象,和启动任务调度。

因为在Spring bean相应的生命周期内,框架已经帮我们完成了启动与调度。

(此处我们不讨论FactoryBean获取bean对象的相关细节,大家应该清楚FactoryBean会通过getObject()来返回我们相应的bean)

SchedulerFactoryBean自动启动任务调度的部分源码

通过查看源码,我们可以看到SchedulerFactoryBean的属性默认支持scheduler的自动启动。

我们也可以通过setAutoStartup()方法来禁用此选项。

    private boolean autoStartup = true;
    /**
     * Set whether to automatically start the scheduler after initialization.
     * &lt;p&gt;Default is "true"; set this to "false" to allow for manual startup.
     */
    public void setAutoStartup(boolean autoStartup) {
        this.autoStartup = autoStartup;
    }

JobDetail与Trigger

编码形式的JobDetail与Trigger其实没有直接绑定,理论上两者都可以复用。但是Spring的形式中因为我们使用了特定的FactoryBean,Trigger绑定了JobDetail,能够复用的仅有JobDetail。

总结

Quartz的功能其实相当强大,此案例只是使用了基本的功能,对于更深入的内容没有展开讨论,更多关于Quartz作业调度的资料请关注脚本之家其它相关文章!

相关文章

  • SpringMVC+EasyUI实现页面左侧导航菜单功能

    SpringMVC+EasyUI实现页面左侧导航菜单功能

    这篇文章主要介绍了SpringMVC+EasyUI实现页面左侧导航菜单功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • java URL乱码的解决办法

    java URL乱码的解决办法

    这篇文章介绍了java URL乱码的解决办法,有需要的朋友可以参考一下
    2013-09-09
  • Java操作Mongodb数据库实现数据的增删查改功能示例

    Java操作Mongodb数据库实现数据的增删查改功能示例

    这篇文章主要介绍了Java操作Mongodb数据库实现数据的增删查改功能,结合完整实例形式分析了java针对MongoDB数据库的连接、增删改查等相关操作技巧,需要的朋友可以参考下
    2017-08-08
  • 关于@Autowired注入依赖失败的问题及解决

    关于@Autowired注入依赖失败的问题及解决

    这篇文章主要介绍了关于@Autowired注入依赖失败的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • Spring Boot 基于注解的 Redis 缓存使用详解

    Spring Boot 基于注解的 Redis 缓存使用详解

    本篇文章主要介绍了Spring Boot 基于注解的 Redis 缓存使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • 详解spring Boot Cli的配置和使用

    详解spring Boot Cli的配置和使用

    本篇文章主要介绍了详解spring Boot Cli的配置和使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • JAVA8妙用Optional解决判断Null为空的问题方法

    JAVA8妙用Optional解决判断Null为空的问题方法

    本文主要介绍了JAVA8妙用Optional解决判断Null为空的问题方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • 超详细讲解SpringCloud Commons公共抽象的用法

    超详细讲解SpringCloud Commons公共抽象的用法

    这篇文章主要介绍了超详细讲解SpringCloud Commons公共抽象的用法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • 谈谈Java中Volatile关键字的理解

    谈谈Java中Volatile关键字的理解

    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果,本文给大家介绍java中volatile关键字,需要的朋友参考下
    2016-03-03
  • java datetime数据类型去掉时分秒的案例详解

    java datetime数据类型去掉时分秒的案例详解

    在Java中,如果我们想要表示一个日期而不包括时间(时分秒),我们通常会使用java.time包中的LocalDate类,这篇文章主要介绍了java datetime数据类型去掉时分秒,需要的朋友可以参考下
    2024-06-06

最新评论