zoukankan      html  css  js  c++  java
  • SpringMVC中使用 OpenSymphony Quartz 调度器

    昨天收到一份笔试题  需要做用到 调度器 今天就开始弄了一下  之前的项目也用过  不过是临时用临时学的 学得不好  今天用的时候发现好多地方不知道

    启动的时候老报错 结果是因为包引入少了

    quartz-all-1.6.0.jar

    spring-context-support.jar

    commons-collections-3.2.jar 一定要是 3.x 的版本 默认ssh是2.X的版本

    感觉自己好坑 因为这个错误我还去找了大神

    说代码

    Quartz使用Trigger, Job以及JobDetail等对象来进行各种类型的任务调度。关于Quartz的基本概念,请参阅http://www.opensymphony.com/quartz。为了让基于Spring的应用程序方便使用,Spring提供了一些类来简化uartz的用法。

    23.2.1. 使用JobDetailBean

    JobDetail 对象保存运行一个任务所需的全部信息。Spring提供一个叫作JobDetailBean的类让JobDetail能对一些有意义的初始值进行初始化。让我们来看个例子:

    <bean name="exampleJob" class="org.springframework.scheduling.quartz.JobDetailBean">
      <property name="jobClass" value="example.ExampleJob" />
      <property name="jobDataAsMap">
        <map>
          <entry key="timeout" value="5" />
        </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 detail bean的名称(在上面的例子中为exampleJob)。

    23.2.2. 使用 MethodInvokingJobDetailFactoryBean

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

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

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

    public class ExampleBusinessObject {
      
      // properties and collaborators
      
      public void doIt() {
        // do the actual work
      }
    }
    <bean id="exampleBusinessObject" class="examples.ExampleBusinessObject"/>

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

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

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

    注意

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

    23.2.3. 使用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">
        <!-- see the example of method invoking job above -->
        <property name="jobDetail" ref="jobDetail" />
        <!-- 10 seconds -->
        <property name="startDelay" value="10000" />
        <!-- repeat every 50 seconds -->
        <property name="repeatInterval" value="50000" />
    </bean>
    
    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail" ref="exampleJob" />
        <!-- run every morning at 6 AM -->
        <property name="cronExpression" value="0 0 6 * * ?" />
    </bean>

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

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


  • 相关阅读:
    从Oracle提供两种cube产品说开
    Sql Server DWBI的几个学习资料
    Unload Oracle data into text file
    初学Java的几个tips
    我常用的Oracle知识点汇总
    benefits by using svn
    如何在windows上使用putty来显示远端linux的桌面
    building commercial website using Microsoft tech stack
    Understand Thread and Lock
    Update google calendar by sunbird
  • 原文地址:https://www.cnblogs.com/Striver-zw/p/4195546.html
Copyright © 2011-2022 走看看