このチュートリアルでは、SpringをQuartzスケジューラフレームワークと統合する方法を説明します。 Springには、Quartzをサポートする多くの便利なクラスがあり、クラスをQuartz APIにデカップリングします。
使用されるツール:
-
Spring 3.1.2.RELEASE
-
クォーツ1.8.6
-
Eclipse 4.2
-
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>
-
Note ** + Unixのcron式は非常に柔軟で強力ですが、以下のWebサイトで詳しく読むことができます:
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
-
link://struts2/struts-2-spring-3-quartz-1-8-scheduler-example/[Struts
2 +スプリング3 +クォーツ1.8の例]