Spring 3 + Quartz 1.8.6スケジューラの例

このチュートリアルでは、SpringをQuartzスケジューラフレームワークと統合する方法を説明します。 Springには、Quartzをサポートする多くの便利なクラスがあり、クラスをQuartz APIにデカップリングします。

使用されるツール:

  1. Spring 3.1.2.RELEASE

  2. クォーツ1.8.6

  3. Eclipse 4.2

  4. Maven 3

    • なぜQuartz 2ではないのですか?** +現在、Spring 3はまだQuartz 2 APIをサポートしていません。このhttps://jira.springsource.org/browse/SPR-8581[SPR-8581バグレポート]を参照してください。バグ修正がリリースされたら、この記事を再度更新します。

1.プロジェクトの依存関係

Spring 3とQuartz 1.8.6を統合するには、以下の依存関係が必要です。

ファイル:pom.xml

...

<依存関係>

<! -  Spring 3の依存関係 - > <依存関係> <groupId> org.springframework </groupId> <artifactId> spring-core </artifactId> <version> 3.1.2.RELEASE </version> </dependency>

<! -  Spring context-support.jarのQuartzJobBean  - > <dependency> <groupId> org.springframework </groupId> <artifactId>スプリングコンテキストサポート</artifactId> <version> 3.1.2.RELEASE </version> </dependency>

<! -  Spring + Quartz need transaction  - > <dependency> <groupId> org.springframework </groupId> <artifactId> spring-tx </artifactId> <version> 3.1.2.RELEASE </version> </dependency >

<! -  Quartz framework  - > <dependency> <groupId> org.quartz-scheduler </groupId> <artifactId>クォーツ</artifactId> <version> 1.8.6 </version> </dependency>

</dependencies>
...

2.スケジューラタスク

通常のJavaクラスを作成します。これはQuartzでスケジュールするクラスです。

ファイル:Run Task.java

package com.mkyong.common;

public class RunMeTask {
    public void printMe() {
        System.out.println("Spring 3 + Quartz 1.8.6 ~");
    }
}

3. Quartz Scheduler Jobを宣言する

Springでは、Quartzジョブを次の2つの方法で宣言できます。

  • 3.1 MethodInvokingJobDetailFactoryBean ** +これはシンプルなスケジューラーに適した、最も単純で直接的な方法です。

<bean id="runMeJob"
    class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">

    <property name="targetObject" ref="runMeTask"/>
    <property name="targetMethod" value="printMe"/>

</bean>
  • 3.2 JobDetailBean ** + `QuartzJobBean`はより柔軟で複雑なスケジューラーに適しています。

Springの QuartzJobBean`を拡張するクラスを作成し、 executeInternal() `メソッドでスケジュールするメソッドを定義し、setterメソッドを介してスケジューラータスク(RunMeTask)を渡す必要があります。

File:RunMeJob.java

package com.mkyong.common;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

public class RunMeJob extends QuartzJobBean {
    private RunMeTask runMeTask;

    public void setRunMeTask(RunMeTask runMeTask) {
        this.runMeTask = runMeTask;
    }

    protected void executeInternal(JobExecutionContext context)
        throws JobExecutionException {

        runMeTask.printMe();

    }
}

jobClass`と jobDataAsMap`を介して実行するメソッドを介してターゲットクラスを設定します。

<bean name="runMeJob" class="org.springframework.scheduling.quartz.JobDetailBean">

    <property name="jobClass" value="com.mkyong.common.RunMeJob"/>

    <property name="jobDataAsMap">
        <map>
            <entry key="runMeTask" value-ref="runMeTask"/>
        </map>
    </property>

</bean>

4.トリガー

Quartzトリガーを設定して、スケジューラージョブをいつ実行するかを定義します。 2つのタイプのトリガがサポートされています。

  • 4.1 SimpleTrigger ** +ジョブを実行する開始時刻、終了時刻、繰り返し間隔を設定できます。

        <!-- Simple Trigger, run every 5 seconds -->
    <bean id="simpleTrigger"
                class="org.springframework.scheduling.quartz.SimpleTriggerBean">

        <property name="jobDetail" ref="runMeJob"/>
        <property name="repeatInterval" value="5000"/>
        <property name="startDelay" value="1000"/>

    </bean>
  • 4.2 CronTrigger ** + Unixのcron式で、あなたの仕事を実行する日時を指定することができます。

    <!-- Cron Trigger, run every 5 seconds -->
    <bean id="cronTrigger"
        class="org.springframework.scheduling.quartz.CronTriggerBean">

        <property name="jobDetail" ref="runMeJob"/>
        <property name="cronExpression" value="0/5 **  **  **  **  ?"/>

    </bean>

5.スケジューラ工場

スケジューラーのファクトリーBeanを作成して、ジョブの詳細とトリガーを統合します。

   <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="jobDetails">
       <list>
          <ref bean="runMeJob"/>
       </list>
    </property>

    <property name="triggers">
        <list>
        <ref bean="simpleTrigger"/>
        </list>
    </property>
   </bean>

6. Spring Bean設定ファイル

完全なSpringのBean構成ファイル。

File:Spring-Quartz.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <bean id="runMeTask" class="com.mkyong.common.RunMeTask"/>

    <!-- Spring Quartz -->
    <bean name="runMeJob" class="org.springframework.scheduling.quartz.JobDetailBean">

        <property name="jobClass" value="com.mkyong.common.RunMeJob"/>

        <property name="jobDataAsMap">
          <map>
            <entry key="runMeTask" value-ref="runMeTask"/>
          </map>
        </property>

    </bean>

    <!--
    <bean id="runMeJob"
            class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="runMeTask"/>
        <property name="targetMethod" value="printMe"/>
    </bean>
    -->

    <!-- Simple Trigger, run every 5 seconds -->
    <bean id="simpleTrigger"
                class="org.springframework.scheduling.quartz.SimpleTriggerBean">

        <property name="jobDetail" ref="runMeJob"/>
        <property name="repeatInterval" value="5000"/>
        <property name="startDelay" value="1000"/>

    </bean>

    <!-- Cron Trigger, run every 5 seconds -->
    <bean id="cronTrigger"
                class="org.springframework.scheduling.quartz.CronTriggerBean">

        <property name="jobDetail" ref="runMeJob"/>
        <property name="cronExpression" value="0/5 **  **  **  **  ?"/>

    </bean>

    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="jobDetails">
            <list>
                <ref bean="runMeJob"/>
            </list>
        </property>

        <property name="triggers">
            <list>
                <ref bean="simpleTrigger"/>
            </list>
        </property>
    </bean>

</beans>

7.デモ

それを〜

package com.mkyong.common;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App
{
    public static void main( String[]args ) throws Exception
    {
        new ClassPathXmlApplicationContext("Spring-Quartz.xml");
    }
}

コンソールに出力します。

Jul 25, 2012 3:23:09 PM org.springframework.scheduling.quartz.SchedulerFactoryBean startScheduler
INFO: Starting Quartz Scheduler now
Spring 3 + Quartz 1.8.6 ~//run every 5 seconds
Spring 3 + Quartz 1.8.6 ~

ソースコードをダウンロードする

ダウンロードする - Spring3-Quartz-Example.zip (25 KB)

参考文献

春のクォーツスケジューラ]。 Quartz Official Website

  1. link://struts2/struts-2-spring-3-quartz-1-8-scheduler-example/[Struts

2 +スプリング3 +クォーツ1.8の例]