`
齐晓威_518
  • 浏览: 618926 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

Spring Quartz定时器 的动态调度

阅读更多
众所周知spring 的Quartz定时器的功能非常强大,可以在特定的年月日小时分秒的时间点触发时间,完成事件的调度,就像windows中得计划任务一样。下面看一个典型的Quartz定时器的实现:

1、首先实现一个用于被执行的类,这个类用于被定时器调度,这个类不需要继承任何类或者接口,代码如下:

public TestQuartz {
      public void doSomething(){
        //TODO
      }
}

2、spring配置文件,具体配置

<!-- 被执行类 -->
<bean id="testQuarzt" class="test.testQuarzt" />

<!-- 将testQuarzt注入到job中 -->
<bean id="testQuartzJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject" ref="testQuarzt" />
    <property name="targetMethod" value="doSomething" />
    <property name="concurrent" value="false" />
</bean>

<!-- 将job注入到定时触发器 -->
<bean id="testTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail" ref="testQuartzJob" />
    <property name="cronExpression">
        <value>0 0 6 * * ?<value>
    <property>
<bean>

<!-- 将触发器注入任务工程 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
      <list>
            <ref bean="testTrigger" />
      </list>
    </property>
</bean>


这样一来,一个简单的Spring Quartz定时器就完成了,这个定时器会在每天早上6点去调testQuarzt类中得doSomething方法,至于为什么是早上六点钟将在最后解释。
但是假设这个定时器部署在tomcat中,如果我们要修改定时器的调度时间,就必须修改spring配置文件,再重启tomcat,事实上,有很多时候我们没有条件去重启tomcat,或者,有特定的需求,需要前台可以直接修改调度时间,这样一来,问题就出现了。
但是我们细心观察,不难发现,调度的时间其实是org.springframework.scheduling.quartz.CronTriggerBean这个类里面的cronExpression属性控制着定时器的调度时间,而事实上,spring肯定在加载配置文件的时候,生成org.springframework.scheduling.quartz.SchedulerFactoryBean的对象,org.springframework.scheduling.quartz.CronTriggerBean的对象,如果我们可以获取这两个对象,问题似乎可以解决了,事实上,我们获取这个对象是非常容易的,只要将这两个对象注入到我们的类中,而且,事实上,在SchedulerFactoryBean中提供了很多方法可以方便我们进行操作。
接下来将作如下修改:
1、修改TestQuartz类,代码如下:

public TestQuartz {

    private Scheduler scheduler;
 
    // 设值注入,通过setter方法传入被调用者的实例scheduler
    public void setScheduler(Scheduler scheduler) {
        this.scheduler = scheduler;
    }

    public void doSomething(){
        //TODO
    }

    public void resetJob(String cronExpression){
        // 运行时可通过动态注入的scheduler得到trigger,注意采用这种注入方式在有的项目中会有问题,如果遇到注入问题,可以采 取在运行方法时候,获得bean来避免错误发生。
        CronTriggerBean trigger = (CronTriggerBean)scheduler.getTrigger("testTrigger",Scheduler.DEFAULT_GROUP);
        String originConExpression = trigger.getCronExpression();
        // 如果相等,则表示用户并没有重新设定数据库中的任务时间,这种情况不需要重新rescheduleJob
        if(!originConExpression.equalsIgnoreCase(cronExpression)){
            trigger.setCronExpression(cronExpression);
            scheduler.rescheduleJob("testTrigger", Scheduler.DEFAULT_GROUP, trigger);
        }
    }

}


2、spring配置文件的修改,如下:

<!-- 被执行类 -->
<bean id="testQuarzt" class="test.testQuarzt">
    <property name="scheduler" ref="schedulerFactory" />
</bean>

<!-- 将testQuarzt注入到job中 -->
<bean id="testQuartzJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject" ref="testQuarzt" />
    <property name="targetMethod" value="doSomething" />
    <property name="concurrent" value="false" />
</bean>

<!-- 将job注入到定时触发器 -->
<bean id="testTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail" ref="testQuartzJob" />
    <property name="cronExpression">
        <value>0 0 6 * * ?<value>
    <property>
<bean>

<!-- 将触发器注入任务工程 -->
<bean id="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
      <list>
            <ref bean="testTrigger" />
      </list>
    </property>
</bean>


如此一来,这个可以动态调度的定时器就完成了,接下来,将以下那个调度时间格式的问题。

字段 允许值 允许的特殊字符
秒 0-59 , - * /
分 0-59 , - * /
小时 0-23 , - * /
日期 1-31 , - * ? / L W C
月份 1-12 或者 JAN-DEC , - * /
星期 1-7 或者 SUN-SAT , - * ? / L C #
年(可选) 留空, 1970-2099 , - * /


0 0 12 * * ?---------------在每天中午12:00触发
0 15 10 ? * *---------------每天上午10:15 触发
0 15 10 * * ?---------------每天上午10:15 触发
0 15 10 * * ? *---------------每天上午10:15 触发
0 15 10 * * ? 2005---------------在2005年中的每天上午10:15 触发
0 * 14 * * ?---------------每天在下午2:00至2:59之间每分钟触发一次
0 0/5 14 * * ?---------------每天在下午2:00至2:59之间每5分钟触发一次
0 0/5 14,18 * * ?---------------每天在下午2:00至2:59和6:00至6:59之间的每5分钟触发一次
0 0-5 14 * * ?---------------每天在下午2:00至2:05之间每分钟触发一次
0 10,44 14 ? 3 WED---------------每三月份的星期三在下午2:00和2:44时触发
0 15 10 ? * MON-FRI---------------从星期一至星期五的每天上午10:15触发
0 15 10 15 * ?---------------在每个月的每15天的上午10:15触发
0 15 10 L * ?---------------在每个月的最后一天的上午10:15触发
0 15 10 ? * 6L---------------在每个月的最后一个星期五的上午10:15触发
0 15 10 ? * 6L 2002-2005---------------在2002, 2003, 2004 and 2005年的每个月的最后一个星期五的上午10:15触发
0 15 10 ? * 6#3---------------在每个月的第三个星期五的上午10:15触发
0 0 12 1/5 * ?---------------从每月的第一天起每过5天的中午12:00时触发
0 11 11 11 11 ?---------------在每个11月11日的上午11:11时触发.?

参考资料:

   1.http://www.springframework.org Spring的官方网站
          2.http://www.opensymphony.com/quartz/ Quartz的官方网站
分享到:
评论

相关推荐

    Spring中的Quartz配置-Spring-定时器-java定时器.doc

    Spring 中的 Quartz 配置-Spring 定时器-java 定时器 在 Spring 框架中,Quartz 是一个非常流行的开源作业调度器,可以实现任务的定时执行。在本篇文章中,我们将讨论如何在 Spring 中配置 Quartz,以实现 Java ...

    Spring Quartz定时器的jar包

    Spring Quartz定时器是Java开发中常用的一个任务调度框架,它结合了Spring框架的强大功能与Quartz的灵活性,使得开发者能够方便地在应用中实现定时任务。在这个压缩包中,包含了三个核心的jar文件:`quartz-all-...

    简单实现Spring Quartz定时器

    Spring Quartz定时器是一种在Java应用中实现定时任务的流行框架,它允许开发者精确地调度任务执行。本篇文章将深入探讨如何在Spring框架中简单实现Quartz定时器,并结合源码和工具来帮助理解其工作原理。 首先,让...

    Spring Quartz 定时器示例(Java工程版)

    Spring Quartz 是一个强大的任务调度框架,它允许开发者在Java应用程序中定义定时任务。这个示例提供了在Spring框架中集成Quartz的详细步骤,适合Java工程的实现。下面将详细介绍Spring与Quartz结合使用的相关知识点...

    spring quartz定时器的简单配置和使用

    本文将详细介绍如何在Spring项目中集成Quartz定时器,并通过一个简单的示例来进行演示。 #### 一、环境准备 为了能够顺利地运行示例代码,我们需要准备以下必要的依赖库: - `jta-1.1.jar`:用于事务管理。 - `...

    spring quartz定时器支持的jar包

    在Spring中,可以借助Quartz库来实现定时任务的调度。 Quartz是一个开源的作业调度框架,能够用于创建、调度、执行和监控重复的作业。在Spring与Quartz结合使用时,通常需要引入几个关键的jar包来支持其功能。根据...

    SpringQuartz定时器的配置[参照].pdf

    Spring Quartz 是一个集成在Spring框架中的任务调度库,它允许开发者轻松地定义和管理定时任务。Quartz本身是一个功能强大的任务调度框架,而Spring通过提供一些便利的类和工具,进一步简化了在Spring环境中使用...

    定时器的配置文件(两种方式:springmvc自带定时,Quartz与spring结合的定时)

    本篇文章将详细讲解两种在Spring MVC框架中实现定时任务的方法:Spring MVC自带的定时器以及Quartz与Spring的集成。 首先,我们来看看Spring MVC自带的定时任务。Spring MVC作为Spring框架的一个模块,主要处理HTTP...

    Spring-quartz实现定时器(含代码)

    本文将深入探讨如何使用Spring整合Quartz来实现定时器,并提供相关代码示例。 首先,理解Spring框架。Spring是一个开源的Java平台,它提供了全面的企业级应用程序开发解决方案,包括依赖注入(DI)、面向切面编程...

    SpringQuartz定时器的配置[归类].pdf

    综上所述,Spring Quartz简化了在Spring应用中使用Quartz的流程,提供了更加面向Spring风格的配置方式,使得任务调度更加直观和易于维护。通过这种方式,你可以轻松地在项目中定义、管理和执行定时任务,满足各种...

    使用spring的quartz定时器要用到的jar包

    首先,要使用Spring的Quartz定时器,你需要确保引入了以下核心的jar包: 1. `quartz.jar`:这是Quartz的核心库,包含了Quartz的调度器、作业、触发器等核心组件。 2. `spring-context-support.jar`:Spring框架提供...

    quartz定时器源码jar包下载

    Quartz定时器允许开发者创建、调度和管理任务,这些任务可以是简单的函数调用或者复杂的业务流程。它支持多种调度策略,如CRON表达式、简单调度(间隔执行)等,使得开发者能够灵活地定义任务的执行时间和频率。 **...

    spring boot集成quartz定时器

    本文将详细讲解如何在Spring Boot项目中集成Quartz定时器,以及如何利用Spring的依赖注入特性来实现Job。 一、集成Quartz定时器 1. 添加依赖:首先,你需要在Spring Boot项目的`pom.xml`或`build.gradle`文件中...

    spring之quartz定时器

    《Spring与Quartz定时器深度解析》 在Java开发领域,Spring框架因其强大的功能和灵活性而备受推崇。其中,Spring对任务调度的支持是其一大亮点,尤其与Quartz的集成,使得开发者能够方便地实现定时任务。Quartz是一...

    spring java 定时器 执行两次 quartz

    Quartz是一款强大的开源任务调度库,它能够与Java应用程序无缝集成,实现复杂的时间触发任务。当我们遇到Spring定时器执行两次或者更多次的问题时,这通常是由于配置不当或者多线程并发导致的。下面将详细介绍如何...

    spring和quartz的定时器的启动和停止例子

    本篇将深入探讨如何在Spring中启动和停止Quartz定时器。 首先,我们需要理解Spring和Quartz的基本概念。Spring是一个强大的Java企业级应用开发框架,它提供了依赖注入(DI)和面向切面编程(AOP)等核心特性。而...

    spring动态定时器封装

    本文将深入探讨如何在Spring框架中进行动态定时器的封装,结合标签"源码"和"工具",我们将探讨Spring与Quartz库的整合,以及如何通过源码理解其实现机制。 首先,让我们了解一下Spring的定时任务支持。Spring提供了...

    Spring Quartz 定时器

    这篇博客“Spring Quartz 定时器”很可能是探讨如何将Quartz集成到Spring应用中,以便利用其强大的定时任务功能。 首先,我们来看一下Spring与Quartz的结合。Spring通过`org.springframework.scheduling.quartz`包...

    spring quartz 表达式在线生成器

    2. **Spring与Quartz集成**:介绍如何在Spring应用中配置Quartz,包括使用`@EnableScheduling`注解开启调度,以及如何定义`@Scheduled`注解的任务。 3. **Cron表达式**:详细讲解Cron表达式的组成部分和语法,以及...

    spring+quartz定时器

    让我们深入探讨一下这个"spring2.0+quartz1.6定时器"的工作原理和实现细节。 首先,Spring框架是一个广泛应用的开源Java框架,它提供了依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented ...

Global site tag (gtag.js) - Google Analytics