Quartzで複数のジョブを実行する例
この例では、Quartz API、Quartz XML、およびSpringを介して複数のQuartzジョブを宣言する方法を示します。クォーツスケジューラフレームワークでは、各ジョブは一意のトリガに接続され、スケジューラによって実行されます。
P.S Quartzでは、複数のジョブに対して1つのトリガーが使用できません。 (これが間違っていれば私を訂正してください)
1. Quartz API
3つのQuartzのジョブ、JobS、JobS、JobSを作成します。
package com.mkyong.quartz;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class JobA implements Job {
@Override
public void execute(JobExecutionContext context)
throws JobExecutionException {
System.out.println("Job A is runing");
}
}
package com.mkyong.quartz;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class JobB implements Job {
@Override
public void execute(JobExecutionContext context)
throws JobExecutionException {
System.out.println("Job B is runing");
}
}
package com.mkyong.quartz;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class JobC implements Job {
@Override
public void execute(JobExecutionContext context)
throws JobExecutionException {
System.out.println("Job C is runing");
}
}
Quartz APIを使用して、上記3つのジョブを宣言し、3つの特定のトリガーに割り当て、スケジュールします。
package com.mkyong.quartz;
import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
public class CronTriggerExample {
public static void main( String[]args ) throws Exception
{
JobKey jobKeyA = new JobKey("jobA", "group1");
JobDetail jobA = JobBuilder.newJob(JobA.class)
.withIdentity(jobKeyA).build();
JobKey jobKeyB = new JobKey("jobB", "group1");
JobDetail jobB = JobBuilder.newJob(JobB.class)
.withIdentity(jobKeyB).build();
JobKey jobKeyC = new JobKey("jobC", "group1");
JobDetail jobC = JobBuilder.newJob(JobC.class)
.withIdentity(jobKeyC).build();
Trigger trigger1 = TriggerBuilder
.newTrigger()
.withIdentity("dummyTriggerName1", "group1")
.withSchedule(
CronScheduleBuilder.cronSchedule("0/5 ** ** ** ** ?"))
.build();
Trigger trigger2 = TriggerBuilder
.newTrigger()
.withIdentity("dummyTriggerName2", "group1")
.withSchedule(
CronScheduleBuilder.cronSchedule("0/5 ** ** ** ** ?"))
.build();
Trigger trigger3 = TriggerBuilder
.newTrigger()
.withIdentity("dummyTriggerName3", "group1")
.withSchedule(
CronScheduleBuilder.cronSchedule("0/5 ** ** ** ** ?"))
.build();
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
scheduler.scheduleJob(jobA, trigger1);
scheduler.scheduleJob(jobB, trigger2);
scheduler.scheduleJob(jobC, trigger3);
}
}
出力
Job A is runing//every 5 seconds Job B is runing Job C is runing Job A is runing//every 5 seconds Job B is runing Job C is runing
2. Quartz XMLの例
XMLファイルの同等のバージョン。 “quartz.properties”と “quartz-config.xml”がプロジェクトのクラスパスにあることを確認してください。
File – quartz.properties
org.quartz.scheduler.instanceName = MyScheduler org.quartz.threadPool.threadCount = 3 org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore org.quartz.plugin.jobInitializer.class =org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin org.quartz.plugin.jobInitializer.fileNames = quartz-config.xml org.quartz.plugin.jobInitializer.failOnFileNotFound = true
File – quartz-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<job-scheduling-data
xmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.quartz-scheduler.org/xml/JobSchedulingData
http://www.quartz-scheduler.org/xml/job__scheduling__data__1__8.xsd"
version="1.8">
<schedule>
<job>
<name>JobA</name>
<group>GroupDummy</group>
<description>This is Job A</description>
<job-class>com.mkyong.quartz.JobA</job-class>
</job>
<trigger>
<cron>
<name>dummyTriggerNameA</name>
<job-name>JobA</job-name>
<job-group>GroupDummy</job-group>
<!-- It will run every 5 seconds -->
<cron-expression>0/5 ** ** ** ** ?</cron-expression>
</cron>
</trigger>
</schedule>
<schedule>
<job>
<name>JobB</name>
<group>GroupDummy</group>
<description>This is Job B</description>
<job-class>com.mkyong.quartz.JobB</job-class>
</job>
<trigger>
<cron>
<name>dummyTriggerNameB</name>
<job-name>JobB</job-name>
<job-group>GroupDummy</job-group>
<!-- It will run every 5 seconds -->
<cron-expression>0/5 ** ** ** ** ?</cron-expression>
</cron>
</trigger>
</schedule>
</job-scheduling-data>
ファイル:web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app ...>
<listener>
<listener-class>
org.quartz.ee.servlet.QuartzInitializerListener
</listener-class>
</listener>
</web-app>
3. Springの例
Springの同等のバージョン。
package com.mkyong.job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
public class JobA extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext arg0)
throws JobExecutionException {
System.out.println("Job A is runing");
}
}
package com.mkyong.job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
public class JobB extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext arg0)
throws JobExecutionException {
System.out.println("Job B is runing");
}
}
package com.mkyong.job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
public class JobC extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext arg0)
throws JobExecutionException {
System.out.println("Job C is runing");
}
}
File:Spring-Quartz.xml
– Spring XML Bean設定ファイルでジョブとトリガを宣言します。
<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="jobA" class="com.mkyong.job.JobA"/>
<bean id="jobB" class="com.mkyong.job.JobB"/>
<bean id="jobC" class="com.mkyong.job.JobC"/>
<!-- Quartz Job -->
<bean name="JobA" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="com.mkyong.job.JobA"/>
</bean>
<bean name="JobB" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="com.mkyong.job.JobB"/>
</bean>
<bean name="JobC" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="com.mkyong.job.JobC"/>
</bean>
<!-- Cron Trigger, run every 5 seconds -->
<bean id="cronTriggerJobA"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="JobA"/>
<property name="cronExpression" value="0/5 ** ** ** ** ?"/>
</bean>
<bean id="cronTriggerJobB"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="JobB"/>
<property name="cronExpression" value="0/5 ** ** ** ** ?"/>
</bean>
<bean id="cronTriggerJobC"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="JobC"/>
<property name="cronExpression" value="0/5 ** ** ** ** ?"/>
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTriggerJobA"/>
<ref bean="cronTriggerJobB"/>
<ref bean="cronTriggerJobC"/>
</list>
</property>
</bean>
</beans>
それを実行します
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");
}
}
出力。
INFO: Starting beans in phase 2147483647 Jul 30, 2012 10:38:13 PM org.springframework.scheduling.quartz.SchedulerFactoryBean startScheduler INFO: Starting Quartz Scheduler now Job A is runing Job B is runing Job C is runing Job A is runing Job B is runing Job C is runing
ソースコードをダウンロードする
それをダウンロードする –
Multiple-Jobs-in-Quartz-Spring-Example.zip
(25kb)