【Spring】Quartz Scheduler

来源:互联网 发布:社交软件英语怎么说 编辑:程序博客网 时间:2024/06/03 19:43

        Quartz使用Trigger,Job和JobDetail对象来实现各种作业的调度。 有关Quartz背后的基本概念,请查看http://quartz-scheduler.org。 为方便起见,Spring提供了几个类,可简化Quartz在基于Spring的应用程序中的使用。

    1. 使用 JobDetailFactoryBean

        Quartz JobDetail对象包含运行作业所需的所有信息。 Spring提供了一个JobDetailFactoryBean,它为XML配置目的提供了bean样式属性。 我们来看一个例子:

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

        作业详细信息配置具有运行作业所需的所有信息(ExampleJob)。 超时在作业数据图中指定。 作业数据映射通过JobExecutionContext(在执行时传递给您)可用,但JobDetail也从映射到作业实例的属性的作业数据中获取其属性。 所以在这种情况下,如果ExampleJob包含一个名为timeout的bean属性,那么JobDetail将会自动应用:

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

    2. 使用 MethodInvokingJobDetailFactoryBean

        通常你只需要调用特定对象的方法。 使用MethodInvokingJobDetail-
FactoryBean可以做到这一点:

<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,您不需要创建仅调用方法的单行作业,您只需创建实际的业务对象并连接详细信息对象。

        默认情况下,Quartz Jobs是无状态的,导致作业干扰对方的可能性。 如果为同一JobDetail指定两个触发器,则可能在第一个作业完成之前,第二个触发器将开始。 如果JobDetail类实现了Stateful接口,这不会发生。 第二个工作不会在第一个工作完成之前开始。 要使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>

    3. 使用触发器和SchedulerFactoryBean接线作业

        我们创建了工作详细信息和工作。 我们还很方便地查看了bean,它允许您调用特定对象的方法。 当然,我们还需要安排自己的工作。 这是使用触发器和SchedulerFactoryBean完成的。 Quartz提供了几个触发器,Spring提供了两个具有方便默认值的Quartz FactoryBean实现:CronTriggerFactoryBean和SimpleTriggerFactoryBean。

        触发器需要安排。 Spring提供了一个SchedulerFactoryBean,它将触发器设置为属性。 SchedulerFactoryBean使用这些触发器调度实际作业。

        以下是一个实例:

<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">    <!-- 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.CronTriggerFactoryBean">    <property name="jobDetail" ref="exampleJob"/>    <!-- run every morning at 6 AM -->    <property name="cronExpression" value="0 0 6 * * ?"/></bean>

        现在我们设置了两个触发器,一个每50秒运行一次,启动延迟为10秒,每天早上6点钟。 要完成所有操作,我们需要设置SchedulerFactoryBean:

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">    <property name="triggers">        <list>            <ref bean="cronTrigger"/>            <ref bean="simpleTrigger"/>        </list>    </property></bean>
原创粉丝点击