`

使用Quartz完成时序调度工作

    博客分类:
  • OPEN
阅读更多
使用Quartz完成时序调度工作
Spring提供了支持时序调度(译者注:Scheduling,下同)的整合类.现在, Spring支持内置于1.3版本以来的JDK中的Timer和Quartz Scheduler(http://www.quartzscheduler.org)。 两个时序调度器通过FactoryBean建立,保持着可选的对Timers或者Triggers的引用。更进一步的, 对于Quartz jobDetail和Timer两者存在一个方便的类允许你调用目标对象(类似于通常的MethodInvokingFactoryBeans)上的某个方法

使用OpenSymphony Quartz Scheduler
Quartz使用Triggers,Jobs和JobDetail来实现时序调度中的各种工作。 为了了解Quartz背后的种种基本观点,你可以移步至http://www.opensymphony.com/quartz。 为了方便的使用,Spring提供了几个类在基于Spring的应用中来简化对Quartz的使用。

使用JobDetailBean
JobDetail 对象包括了运行一个job所需要的所有信息。 于是Spring提供了一个所谓的JobDetailBean使得JobDetail拥有了一个真实的,有意义的默认值。让我们来看个例子:

<bean name="exampleJob" class="org.springframework.scheduling.quartz.JobDetailBean">
  <property name="jobClass">
    <value>example.ExampleJob</value>
  </property>
  <property name="jobDataAsMap">
    <map>
      <entry key="timeout"><value>5</value></entry>
    </map>
  </property>
</bean>

Job detail bean拥有所有运行job(ExampleJob)的必要信息。通过job的data map来制定timeout。 Job的data map可以通过JobExecutionContext(在运行时刻传递给你)来得到, 但是JobDetailBean也把从job的data map中得到的属性映射到实际job中的属性中去。 所以,如果ExampleJob中包含一个名为timeout的属性,JobDetailBean将自动为它赋值:

package example;

public class ExampleJob extends QuartzJobBean {

  private int timeout;
 
  /**
   * Setter called after the ExampleJob is instantiated
   * with the value from the JobDetailBean (5)
   */
  public void setTimeout(int timeout) {
    this.timeout = timeout;
  }
 
  protected void executeInternal(JobExecutionContext ctx)
  throws JobExecutionException {
 
      // do the actual work
     
  }
}

所有Job detail bean中的一些其他的设定对你来说也是可以同样设置的.

注意:使用name和group属性,你可以修改job在哪一个组下运行和使用什么名称。 默认情况下,job的名称等于job detai bean的名称(在上面的例子中为exampleJob)。

使用MethodInvokingJobDetailFactoryBean
通常情况下,你只需要调用特定对象上的一个方法。你可以使用MethodInvokingJobDetailFactoryBean准确的做到这一点:

<bean id="methodInvokingJobDetail"
  class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject"><ref bean="exampleBusinessObject"/></property>
    <property name="targetMethod"><value>doIt</value></property>
</bean>

上面例子将导致exampleBusinessObject中的doIt方法被调用(如下):

public class BusinessObject {
 
  // properties and collaborators
 
  public void doIt() {
    // do the actual work
  }
}


<bean id="exampleBusinessObject" class="examples.ExampleBusinessObject"/>

使用MethodInvokingJobDetailFactoryBean你不需要创建只有一行代码且只调用一个方法的job, 你只需要创建真实的业务对象来包装具体的细节的对象。

默认情况下,Quartz Jobs是无状态的,可能导致jobs之间互相的影响。如果你为相同的JobDetail指定两个触发器, 很可能当第一个job完成之前,第二个job就开始了。如果JobDetail对象实现了Stateful接口,就不会发生这样的事情。 第二个job将不会在第一个job完成之前开始。为了使得jobs不并发运行,设置MethodInvokingJobDetailFactoryBean中的concurrent标记为false。

<bean id="methodInvokingJobDetail"
  class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject"><ref bean="exampleBusinessObject"/></property>
    <property name="targetMethod"><value>doIt</value></property>
</bean>

注意:默认情况下,jobs在并行的方式下运行。

使用triggers和SchedulerFactoryBean来包装任务
我们已经创建了job details,jobs。我们回顾了允许你调用特定对象上某一个方法的便捷的bean。 当然我们仍需要调度这些jobs。这需要使用triggers和SchedulerFactoryBean来完成。 Quartz自带一些可供使用的triggers。Spring提供两个子类triggers,分别为CronTriggerBean和SimpleTriggerBean。

Triggers也需要被调度。Spring提供SchedulerFactoryBean来暴露一些属性来设置triggers。SchedulerFactoryBean负责调度那些实际的triggers。

两个例子:

<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
  <property name="jobDetail">
    <!-- see the example of method invoking job above -->   
    <ref bean="methodInvokingJobDetail"/>
  </property>
  <property name="startDelay">
    <!-- 10 seconds -->
    <value>10000</value>
  </property>
  <property name="repeatInterval">
    <!-- repeat every 50 seconds -->
    <value>50000</value>
  </property>
</bean>

<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
  <property name="jobDetail">
    <ref bean="exampleJob"/>
  </property>
  <property name="cronExpression">
    <!-- run every morning at 6 am -->
    <value>0 6 * * 1</value>
  </property>
</bean>

现在我们创建了两个triggers,其中一个开始延迟10秒以后每50秒运行一次,另一个每天早上6点钟运行。 我们需要创建一个SchedulerFactoryBean来最终实现上述的一切:

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  <property name="triggers">
    <list>
      <ref local="cronTrigger"/>
      <ref local="simpleTrigger"/>
    </list>
  </property>
</bean>

更多的一些属性你可以通过SchedulerFactoryBean来设置,例如job details使用的Calendars,用来订制Quartz的一些属性以及其它。 你可以看相应的JavaDOC(http://www.springframework.org/docs/api/org/springframework/scheduling/quartz/SchedulerFactoryBean.html)来了解进一步的信息。
分享到:
评论

相关推荐

    spring中使用Quartz完成时序调度工作

    NULL 博文链接:https://liuxi1024.iteye.com/blog/345093

    小议时序调度Timer和Quartz

    "小议时序调度Timer和Quartz"这个主题主要关注Java平台上的两种常见定时任务框架:Java内置的`java.util.Timer`类和开源的Quartz库。 首先,让我们详细探讨一下`java.util.Timer`。这个类是Java标准库的一部分,它...

    quartz动态定时调度完整代码

    这个压缩包“quartz动态定时调度完整代码”提供了使用Quartz进行动态任务调度的示例代码和相关资源。 在Quartz中,核心概念包括Scheduler(调度器)、Job(任务)和Trigger(触发器)。Scheduler是整个调度系统的...

    利用Quartz实现任务调度的集群

    【Quartz任务调度集群】是Java开发中解决定时任务需求的一种高效方案,它由OpenSymphony团队开发,自2001年以来广泛应用于各种项目。Quartz的核心优势在于其灵活性和简单性,允许开发者自由定义任务触发的时间表,...

    quartz3种调度形式+传参.zip

    在不依赖任何框架的情况下,直接使用Quartz API进行任务调度。首先,你需要创建一个Job类,实现`org.quartz.Job`接口,并重写`execute(JobExecutionContext context)`方法。然后,定义Trigger来决定任务何时执行,...

    quartz 定时任务调度

    总的来说,Quartz 提供了一个强大的定时任务调度平台,结合 Spring 使用,可以简化开发过程,使开发者专注于业务逻辑,而不需要关心底层的调度实现。通过配置和编程接口,我们可以灵活地定义和管理各种定时任务,...

    Quartz(作业调度)

    Quartz是一款开源的作业调度框架,它为Java应用程序提供了强大的定时任务处理能力。在Spring框架中,Quartz可以被集成来实现复杂的定时任务调度。本文将深入探讨Quartz的使用,包括其基本概念、配置、API以及在Web...

    Java使用quartz实现任务调度定时任务

    `quartz_job.sql`文件可能包含Quartz所需的数据库表结构,Quartz使用数据库来存储Job和Trigger的信息,以便在系统重启后仍能恢复之前设置的任务。你需要根据自己的数据库类型(如MySQL、Oracle等)对这个SQL脚本进行...

    ASP.NET使用Quartz.NET实现定时任务调度

    总的来说,使用ASP.NET、Quartz.NET和TopShelf的组合,开发者可以构建出一个高效、稳定且易于维护的任务调度系统,对于需要后台自动化处理的工作场景,这是一种非常实用的解决方案。在实际应用中,可以根据具体需求...

    quartz的分布式调度大致分两种方式实现

    如果需要扩展以支持数千个短期运行(例如1秒)作业,则可以考虑通过使用多个不同的调度程序(包括HA的多个群集调度程序)对作业集进行分区。 调度程序使用集群范围的锁,这种模式会在添加更多节点(超过三个节点 - ...

    Quartz.net作业调度自定义定时执行任务多任务执行c#

    在"Quartz.net作业调度自定义定时执行任务多任务执行c#"这个主题中,我们将深入探讨如何使用Quartz.NET来实现自定义的定时任务,以及如何处理多任务执行。 首先,我们需要理解Quartz.NET的基本概念。在Quartz.NET中...

    Quartz(任务调度)使用培训

    标题和描述中提到的主题是关于Quartz任务调度系统的使用培训。Quartz是一个开源的任务调度库,其主要用途是让开发者能够轻松地安排在特定时间或根据特定规则运行代码的任务,也就是作业(Jobs)。Quartz能够与Java...

    Quartz.Net任务调度

    Quartz.Net是一个强大的任务调度框架,它在.NET环境中被广泛应用,...这个QuartzDemo压缩包很可能是包含了一个简单的Quartz.Net应用实例,你可以解压后学习其结构和代码,以便更好地理解和使用这个强大的任务调度框架。

    quartz1.5.0 任务调度demo

    在这个"quartz1.5.0 任务调度demo"中,我们将会探讨如何使用Quartz实现任务的增删改功能,以及其三大核心组件:JobDetail、Trigger和Scheduler。 首先,**JobDetail**是Quartz中的工作类,它定义了一个具体的任务,...

    quartz开源作业调度框架

    在Web应用中使用Quartz,需要进行额外的配置: 1. **添加QuartzInitializerServlet**:在`web.xml`中配置`QuartzInitializerServlet`。 2. **配置文件**:可以通过配置文件`quartz.properties`或`quartz-job.xml`来...

    quartzDemo任务调度例子

    Quartz是Java领域一款强大的开源任务调度框架,它允许开发者...通过研究和理解这个示例,你可以掌握如何在自己的Java应用中使用Quartz进行任务调度,无论是简单的周期性任务还是复杂的定时策略,Quartz都能轻松应对。

    Spring+Quartz实现任务调度的小例子

    Spring框架和Quartz是两个广泛使用的工具,它们可以协同工作以实现复杂和灵活的任务调度。本篇文章将深入探讨如何使用Spring与Quartz结合来创建一个任务调度的小例子。 首先,Spring是一个开源的Java企业级应用开发...

Global site tag (gtag.js) - Google Analytics