`
virusfu
  • 浏览: 182907 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用Quartz或Timer完成时序调度工作

    博客分类:
  • java
阅读更多

使用Quartz或Timer完成时序调度工作

简介

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

使用OpenSymphony Quartz Scheduler

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

18.2.1. 使用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中的一些其他的设定对你来说也是可以同样设置的.

注意:使用namegroup属性,你可以修改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,分别为CronTriggerBeanSimpleTriggerBean

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)来了解进一步的信息。

使用JDK Timer支持类

另外一个调度任务的途径是使用JDK Timer对象。更多的关于Timers的信息可以在这里http://java.sun.com/docs/books/tutorial/essential/threads/timer.html找到。 上面讨论的概念仍可以应用于Timer的支持。你可以创建定制的timer或者调用某些方法的timer。 包装timers的工作由TimerFactoryBean完成。

创建定制的timers

你可以使用TimerTask创建定制的timer tasks,类似于Quartz中的jobs:

public class CheckEmailAddresses extends TimerTask {

  private List emailAddresses;
  
  public void setEmailAddresses(List emailAddresses) {
    this.emailAddresses = emailAddresses;
  }
  
  public void run() {
  
    // iterate over all email addresses and archive them
    
  }
}
			

包装它是简单的:

<bean id="checkEmail" class="examples.CheckEmailAddress">
  <property name="emailAddresses">
    <list>
      <value>test@springframework.org</value>
      <value>foo@bar.com</value>
      <value>john@doe.net</value>
    </list>
  </property>
</bean>

<bean id="scheduledTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
  <!-- wait 10 seconds before starting repeated execution -->
  <property name="delay">
    <value>10000</value>
  </property>
  <!-- run every 50 seconds -->
  <property name="period">
    <value>50000</value>
  </property>
  <property name="timerTask">
    <ref local="checkEmail"/>
  </property>
</bean>
			

 

 使用MethodInvokingTimerTaskFactoryBean

就像Quartz的支持一样,Timer的支持也有一个组件允许你周期性地调用一个方法:

<bean id="methodInvokingTask" 
  class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
    <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
  }
}
			

把上面例子中提到ScheduledTimerTask的引用改为methodInvokingTask将导致该task被执行。

包装:使用TimerFactoryBean来建立tasks

TimerFactoryBean类似于QuartzSchedulerFactoryBean,都是服务于一个目的:建立起实际的时序调度。 TimerFactoryBean建立一个实际的Timer来调度它引用的那些tasks。你可以指定它是否使用一个守护线程。

<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean">
  <property name="scheduledTimerTasks">
    <list>
      <!-- see the example above -->
      <ref local="scheduledTask"/>
    </list>
  </property>
</bean>
			
分享到:
评论

相关推荐

    小议时序调度Timer和Quartz

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

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

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

    Spring 使用Timer quartz区别

    `Timer` 的工作原理是通过创建一个后台线程,当设定的时间到达时,它会调度任务进行执行。然而,`Timer` 有一些限制,比如它不支持并发任务执行,如果一个任务执行时间过长,会影响到其他任务的调度。此外,`Timer` ...

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

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

    Java 定时任务及作业调度 Quartz与Timer

    Java定时任务和作业调度在软件...总的来说,理解并掌握Java的定时任务和作业调度,无论是Quartz还是Timer,都是提升开发效率和系统自动化能力的重要技能。通过实践和不断探索,可以更好地利用这些工具为项目带来便利。

    Spring的定时任务开发及对Quartz和Timer支持

    通过实现这些接口或使用其默认实现,如ThreadPoolTaskExecutor和ConcurrentTaskScheduler,我们可以轻松地在Spring应用中集成任务调度。 接下来,Spring还支持集成第三方定时任务库,如Quartz和Timer。Quartz是一个...

    spring timer、quartz俩种任务调度

    总的来说,`Spring Timer`适合简单的定时任务需求,而`Quartz Scheduler`更适合处理大型项目或需要高级调度功能的场景。在实际应用中,开发者可以根据项目需求选择合适的任务调度器。通过`spring-taskScheduling`这...

    Spring的quartz和Timer实现定时

    在Java世界中,任务调度是十分重要的,Spring框架提供了多种定时任务实现方式,其中包括Quartz和Timer。Quartz是一款开源的作业调度框架,而Timer是Java标准库中的一个类,用于执行定时任务。这两个工具都能帮助...

    quartz3种调度形式+传参.zip

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

    quartz 和 Timer实现定时功能

    总结来说,`Timer`适合简单的定时任务,而`Quartz`更适合需要复杂调度和管理的定时任务。在实际项目中,根据需求选择合适的定时任务工具是非常重要的。对于大型项目,`Quartz`的灵活性和可扩展性使其成为首选;而...

    Quartz(作业调度)

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

    spring 整合 quartz|| timer

    spring 整合 quartz|| timer有几种方式? 我收集的:《spring定时Timer&Quartz》 代码示例,依赖spring2.x.jar quartz1.6.x.jar 相关介绍: http://blog.csdn.net/liu251/archive/2009/08/18/4459514.aspx

    Quartz.NET 调度系统 demo

    本文使用一系列代码示例介绍 Quartz.NET API,演示它的机制,例如作业、触发器、作业仓库。 Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net...

    Java中使用Quartz实现任务自动调度的经典例子!

    Quartz是Java中一个强大的开源任务调度库,它允许开发者定义和执行短时或周期性的任务。...通过学习和实践这个例子,你将能够熟练地在Java项目中使用Quartz进行任务调度,实现复杂的工作流自动化。

    Quartz一个开源作业调度框架

    Quartz 是一个强大的开源作业调度框架,主要用于自动化执行任务,如定时发送邮件、执行数据清理、执行批处理等。该框架完全用 Java 编写,兼容 J2SE 和 J2EE 环境,提供了丰富的功能和灵活性,使得开发者能够方便地...

    quartz 时间调度器的使用

    Quartz 的源码提供了丰富的注释,你可以查看 `org.quartz.impl.StdSchedulerFactory`、`org.quartz.Scheduler`、`org.quartz.Trigger` 和 `org.quartz.Job` 等关键类,了解它们如何协同工作来实现任务调度。...

    quartz+spring分布式集群调度

    Quartz是一款开源的作业调度框架,它允许程序创建并管理作业和触发器,实现任务的自动执行。结合Spring,可以方便地在企业级应用中实现复杂的定时任务调度。本文将深入探讨如何在分布式环境中利用Quartz和Spring构建...

Global site tag (gtag.js) - Google Analytics