Spring配置集群定时任务

正常配置定时任务的时候配置定时任务调度工厂的代码如下

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

当项目部署到集群的时候会出现定时任务多次执行的情况

这时候需要用到Spring定时任务的集群功能,代码如下

<bean id="" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
    <property name="applicationContextSchedulerContextKey" value="applicationContext" />        
    <property name="configLocation" value="classpath://quartz.properties"></property>
    <property name="overwriteExistingJobs" value="true"/>  
    <property name="triggers">   
        <list>
            <ref bean="" />
            <ref bean=""/>
        </list>
    </property>
</bean>

集群实例的 quartz.properties 文件示例

#==============================================================  
#Configure Main Scheduler Properties  
#==============================================================   
org.quartz.scheduler.instanceName = TestScheduler1   
org.quartz.scheduler.instanceId = instance_one  
#==============================================================  
#Configure ThreadPool  
#==============================================================   
org.quartz.threadPool.class = org.quartz.simpl.Simple ThreadPool   
org.quartz.threadPool.threadCount = 5   
org.quartz.threadPool.threadPriority = 5  
#==============================================================  
#Configure JobStore  
#==============================================================   
org.quartz.jobStore.misfireThreshold = 60000   
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX   
org.quartz.jobStore.driverDelegateClass =   
org.quartz.impl.jdbcjobstore.MSSQLDelegate   
org.quartz.jobStore.tablePrefix = QRTZ_   
org.quartz.jobStore.dataSource = myDS   
  
org.quartz.jobStore.isClustered = true  
org.quartz.jobStore.clusterCheckinInterval = 20000  
#==============================================================  
#Non-Managed Configure Datasource  
#==============================================================   
org.quartz.dataSource.myDS.driver = net.sourceforge.jtds.jdbc.Driver   
org.quartz.dataSource.myDS.URL = jdbc:jtds:sqlserver://localhost:1433/quartz   
org.quartz.dataSource.myDS.user = admin   
org.quartz.dataSource.myDS.password = admin   
org.quartz.dataSource.myDS.maxConnections = 10  

也可以使用重写SchedulerFactoryBean类的方法来实现Quarz的集群

<bean id="" class="framework.base.SchedulerFactoryBean">
    <property name="applicationContextSchedulerContextKey">
        <value>applicationContext</value>
    </property>
    <property name="triggers">
        <list>
            <ref bean="extractTrigger"/>
        </list>
    </property>
</bean>
package framework.scheduling;

import java.io.InputStream;
import java.io.Serializable;

import org.springframework.core.io.InputStreamResource;
import org.springframework.core.io.Resource;

public class SchedulerFactoryBean extends org.springframework.scheduling.quartz.SchedulerFactoryBean implements Serializable{

    private static final long serialVersionUID = -1160717800136961172L;

    public SchedulerFactoryBean() {
        super();
        InputStream in = getClass().getClassLoader().getResourceAsStream("scheduling/quartz.properties");
        if(in!=null){
            Resource resource = new InputStreamResource(in);
            setConfigLocation(resource);
        }else{
            logger.warn("没有发现集群的quartz.properties配置文件。");
        }
        setOverwriteExistingJobs(true);
    }
}

配置好Quarz集群后可以保证项目在集群环境下定时任务的正常执行

原文地址:https://www.cnblogs.com/huangjian2/p/6802831.html