[java]spring-Quartz集群

上篇博客讲了quartz的用法,解决了定时任务的问题,但是当我们搭建集群,将服务部署在多个机器上时,很有可能引起冲突的问题,一个任务,多次执行,那么如何解决这个问题呢,quartz提供了集群的搭建方案,确保一个任务,只会在一个时间执行一次,下面我们来学习一下quartz集群的搭建。

原理

quartz连接数据库,然后从表里去读取相关配置信息,多个任务通过表来达到统一。

搭建

环境

spring 4.0.6
quartz 2.2.3
mysql 5.1.38
druid 1.1.0
首先来看一下目录结构:
[java]spring-Quartz集群_第1张图片

pom文件引用如下:



    4.0.0

    com.spring.quartzm
    quartzm
    1.0-SNAPSHOT

    
        4.0.6.RELEASE
        2.2.3
    

    
        
            org.springframework
            spring-core
            ${springframework.version}
        
        
            org.springframework
            spring-context-support
            ${springframework.version}
        
        
        
            org.springframework
            spring-tx
            ${springframework.version}
        
        
            org.springframework
            spring-web
            ${springframework.version}
        
        
        
            org.quartz-scheduler
            quartz
            ${quartz.version}
        
        
            junit
            junit
            4.12
        

        
            org.springframework
            spring-jdbc
            4.3.3.RELEASE
        

        
            mysql
            mysql-connector-java
            5.1.38
        
        
            com.alibaba
            druid
            1.1.0
        
    

数据库连接

数据库的建表语句等在quartz-2.2.3-distribution.tar.gz包里面quartz-2.2.3-distribution.tar\quartz-2.2.3\docs\dbTables\下,因为我的数据库是mysql,所以我选择的是tables_mysql_innodb.sql

spring我只用了一个配置文件,名字为quartz-context.xml,数据库建好以后,配置数据库连接,如下:

  
    

        
        
        
    
    
    
        
        
        
            
                classpath:db.properties
                
            
        
    

quartz配置文件

配置文件内容为:

#==============================================================
#Configure Main Scheduler Properties
#==============================================================
org.quartz.scheduler.instanceName = defaultScheduler  
org.quartz.scheduler.instanceId = AUTO  

#==============================================================
#Configure JobStore
#==============================================================
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX  
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate  
org.quartz.jobStore.tablePrefix = QRTZ_  
org.quartz.jobStore.isClustered = true  
org.quartz.jobStore.clusterCheckinInterval = 20000    
org.quartz.jobStore.dataSource = myDS  
org.quartz.jobStore.maxMisfiresToHandleAtATime = 1  
org.quartz.jobStore.misfireThreshold = 120000  
org.quartz.jobStore.txIsolationLevelSerializable = true  

#==============================================================
#Configure ThreadPool
#==============================================================
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool  
org.quartz.threadPool.threadCount = 10  
org.quartz.threadPool.threadPriority = 5  
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true  

#==============================================================
#Skip Check Update
#update:true
#not update:false
#==============================================================
org.quartz.scheduler.skipUpdateCheck = true   

#============================================================================
# Configure Plugins
#============================================================================
org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin     
org.quartz.plugin.shutdownhook.class = org.quartz.plugins.management.ShutdownHookPlugin  
org.quartz.plugin.shutdownhook.cleanShutdown = true  

spring配置文件内容

JobDetail配置

上篇博客中我们配置jobDetail时使用的是org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean
但是在搭建集群时使用这个会报错,说我们的任务类没有序列化,所以我们使用另一种
org.springframework.scheduling.quartz.JobDetailFactoryBean
如下:

    
        
        
        
    
Trigger与上一篇相同即可

    
        
        
        
        
    

    
    
        
        
        
        
    
Scheduling需要注意一下

    
        
        
        
        
        
        
        
        
        
        
            
                
        
    

完整的quartz-context.xml




    

    
    
        
        
        
        
        
        
    

    
        
        
        
    

    
    
        
        
        
        
    

    
    
        
        
        
        
    

    
    
        
        
        
        
        
        
        
        
        
        
            
                
            
        
    
    
    

        
        
        
    
    
    
        
        
        
            
                classpath:db.properties
                
            
        
    

任务类

任务类需要实现Job接口

package com.cdsmartlink.service;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.stereotype.Component;

/**
 * Created by L on 2017-07-22.
 */
@Component
public class ExtendsJob implements Job{
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("这里是我们的任务代码!!!!");
    }
}

测试

package com.cdsmartlink.service.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Created by L on 2017-07-22.
 */
public class MyJobTest{

    @Test
    public void test() throws InterruptedException {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("quartz-context.xml");
        Thread.sleep(60000);
    }
}

其实也可以在tomcat上多发布几个,来进行测试,这里就不举例子了。

总结

一开始研究Quartz集群的时候,其实我是很无语的,毕竟感觉这个用处不是很大,不过研究着就会发现,有很多比自己牛多了的人,在全心全意为人民服务。

你可能感兴趣的:(java)