SpringにおけるQuartzのJobシーケンス実行

8968 ワード

Quartzを使用して計画タスクを行う場合、デフォルトでは、前のタスクが終了したかどうかにかかわらず、現在のタスクは常に実行されます.
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