SpringにおけるQuartzのJobシーケンス実行
8968 ワード
Quartzを使用して計画タスクを行う場合、デフォルトでは、前のタスクが終了したかどうかにかかわらず、現在のタスクは常に実行されます.
Springを使用してQuartzのJobを構成する場合も、前のタスクが終了するかどうかにかかわらず、デフォルトの現在のタスクは常に実行されます.
したがって、デフォルト条件を使用する場合は、同時実行の論理的な問題を考慮する必要があります.そうしないと、順序実行に設定する必要があります.
Spring構成QuartzのDemoを書きました.中Springのxmlで
コードは次のとおりです.
Main関数のエントリクラスは次のとおりです.
Jobのテストクラスは以下の通りです.
SpringのQuartzで実行されるスレッドサイズを設定しない場合、デフォルトは10個です.
スレッドプールのサイズを指定することもできます.コードは次のとおりです.
SpringのXMLで構成 org.springframework.scheduling.quartz.M ethodInvokingJobDetailFactoryBeanの concurrentの属性は,QuartzのJobが順次実行されるか,あるいは順序を考慮しない並列実行されるかを決定することができる.
表示 MethodInvokingJobDetailFactoryBean説明{{MethodInvokingJobDetailFactoryBean:せつめい}} concurrentプロパティの元のコードで、デフォルトは「パラレル」であることがわかります.
MethodInvokingJobDetailFactoryBean の部分コード:
Quartz原生のJobの手順については、記事を参照してください. http://feuyeux.iteye.com/blog/1842966
Springを使用してQuartzのJobを構成する場合も、前のタスクが終了するかどうかにかかわらず、デフォルトの現在のタスクは常に実行されます.
したがって、デフォルト条件を使用する場合は、同時実行の論理的な問題を考慮する必要があります.そうしないと、順序実行に設定する必要があります.
Spring構成QuartzのDemoを書きました.中Springのxmlで
コードは次のとおりです.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:jms="http://www.springframework.org/schema/jms" xmlns:lang="http://www.springframework.org/schema/lang"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:oxm="http://www.springframework.org/schema/oxm"
xmlns:p="http://www.springframework.org/schema/p" xmlns:sec="http://www.springframework.org/schema/security"
xmlns:task="http://www.springframework.org/schema/task" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd
http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-4.0.xsd
http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-4.0.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-4.0.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
<bean id="testJob"
class="org.kanpiaoxue.learn.quartz.disallowConcurrentExecution.TestJob" />
<bean id="testJobDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="testJob" />
<property name="targetMethod" value="execute" />
<!-- Quartz , , , 。
<property name="concurrent" value="false" /> Job 。
<property name="concurrent" value="true" /> Job , Job 。
-->
<property name="concurrent" value="false" />
</bean>
<bean id="testJobCronTrigger"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="testJobDetail" />
<!-- 1 -->
<property name="cronExpression" value="0/1 * * * * ? *" />
</bean>
<bean id="taskExecutor"
class="org.kanpiaoxue.learn.quartz.disallowConcurrentExecution.ThreadPoolExecutorImpl">
<constructor-arg name="nThreads" value="30" />
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="taskExecutor" ref="taskExecutor" />
<property name="triggers">
<list>
<ref bean="testJobCronTrigger" />
</list>
</property>
</bean>
<!-- job end -->
</beans>
Main関数のエントリクラスは次のとおりです.
import org.springframework.context.support.FileSystemXmlApplicationContext;
/**
* <pre>
* Test.java
* @author kanpiaoxue<br>
* @version 1.0
* Create Time 2014 8 12 6:45:06<br>
* Description : main
* </pre>
*/
public class Test {
/**
* <pre>
* @param args
* </pre>
*/
@SuppressWarnings("resource")
public static void main(String[] args) {
new FileSystemXmlApplicationContext(
"D:/org/kanpiaoxue/learn/quartz/disallowConcurrentExecution/spring-ctx-application.xml");
}
}
Jobのテストクラスは以下の通りです.
import org.joda.time.DateTime;
import java.util.concurrent.TimeUnit;
/**
* <pre>
* TestJob.java
* @author kanpiaoxue<br>
* @version 1.0
* Create Time 2014 8 12 6:45:48<br>
* Description : Job
* </pre>
*/
public class TestJob {
public TestJob() {
}
public void execute() throws InterruptedException {
System.out.println(String.format("[%s] %s start to work", getNow(),
Thread.currentThread().getName()));
/**
* Job 20 , Job 。
*/
TimeUnit.SECONDS.sleep(20L);
System.out.println(String.format("[%s] %s wake up.", getNow(), Thread
.currentThread().getName()));
}
private String getNow() {
return DateTime.now().toString("yyyy-MM-dd HH:mm:ss");
}
}
SpringのQuartzで実行されるスレッドサイズを設定しない場合、デフォルトは10個です.
スレッドプールのサイズを指定することもできます.コードは次のとおりです.
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* <pre>
* ThreadPoolExecutorImpl.java
* @author kanpiaoxue<br>
* @version 1.0
* Create Time 2014 8 12 7:04:44<br>
* Description :
* </pre>
*/
public class ThreadPoolExecutorImpl extends ThreadPoolExecutor {
/**
* <pre>
* @param nThreads
* </pre>
*/
public ThreadPoolExecutorImpl(int nThreads) {
super(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
}
SpringのXMLで構成 org.springframework.scheduling.quartz.M ethodInvokingJobDetailFactoryBeanの concurrentの属性は,QuartzのJobが順次実行されるか,あるいは順序を考慮しない並列実行されるかを決定することができる.
表示 MethodInvokingJobDetailFactoryBean説明{{MethodInvokingJobDetailFactoryBean:せつめい}} concurrentプロパティの元のコードで、デフォルトは「パラレル」であることがわかります.
MethodInvokingJobDetailFactoryBean の部分コード:
public class MethodInvokingJobDetailFactoryBean extends ArgumentConvertingMethodInvoker
implements FactoryBean<JobDetail>, BeanNameAware, BeanClassLoaderAware, BeanFactoryAware, InitializingBean {
private static Class<?> jobDetailImplClass;
private static Method setResultMethod;
static {
try {
jobDetailImplClass = Class.forName("org.quartz.impl.JobDetailImpl");
}
catch (ClassNotFoundException ex) {
jobDetailImplClass = null;
}
try {
Class<?> jobExecutionContextClass =
QuartzJobBean.class.getClassLoader().loadClass("org.quartz.JobExecutionContext");
setResultMethod = jobExecutionContextClass.getMethod("setResult", Object.class);
}
catch (Exception ex) {
throw new IllegalStateException("Incompatible Quartz API: " + ex);
}
}
private String name;
private String group = Scheduler.DEFAULT_GROUP;
private boolean concurrent = true;
Quartz原生のJobの手順については、記事を参照してください. http://feuyeux.iteye.com/blog/1842966