项目使用quartz框架完成了定时任务集群部署调度,并且对quartz进一步封装完成在web界面可动态配置定时任务。定时任务如果集群部署,到达时间点时,同一个任务只能在其中一台机器上执行。对于quartz框架,其支持分布式集群的方案是使用数据库来加锁调度。
以下是quartz分布式集群部署,并且可以动态配置job的代码。使用了spring和mybatis,数据库使用了postgresql(用mysql也差不多,只要改下数据源dataSource,以及quartz.properties中的org.quartz.jobStore.driverDelegateClass)。
quartz.properties:
# Default Properties file for use by StdSchedulerFactory
# to create a Quartz Scheduler Instance, if a different
# properties file is not explicitly specified.
#
#org.quartz.scheduler.instanceName: DefaultQuartzScheduler
org.quartz.scheduler.instanceName: ClusteredScheduler
org.quartz.scheduler.instanceId: AUTO
org.quartz.scheduler.rmi.export: false
org.quartz.scheduler.rmi.proxy: false
org.quartz.scheduler.wrapJobExecutionInUserTransaction: false
org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount: 2
org.quartz.threadPool.threadPriority: 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
org.quartz.jobStore.class : org.quartz.impl.jdbcjobstore.JobStoreTX
##这里使用postgresql数据库
org.quartz.jobStore.driverDelegateClass: org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
org.quartz.jobStore.misfireThreshold : 60000
org.quartz.jobStore.useProperties : true
org.quartz.jobStore.tablePrefix : QRTZ_
org.quartz.jobStore.isClustered : true
org.quartz.jobStore.clusterCheckinInterval : 15000
application-scheduler.xml:
xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
default-autowire="byName" default-lazy-init="true">
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
SchedulerJobBO:
/**
* job信息bean
* @author hanxuetong
*
*/
@SuppressWarnings("serial")
public class SchedulerJobBO extends BasePO{
/**
* 定时任务运行时状态
*/
public static final int SCHEDULER_RUN_STATE=1;
/**
* 定时任务关闭时状态
*/
public static final int SCHEDULER_STOP_STATE=0;
/**
* 任务名
*/
private String jobName;
private String jobGroup;
/**
* 任务类的路径
*/
private String jobClassPath;
/**
* cron表达式
*/
private String cronExpression;
/**
* 是否启动定时
*/
private Integer isRun;
/**
* 世纪运行中的状态
*/
private String triggerState;
/**
* 世纪运行中的状态名
*/
private String triggerStateName;
/**
* 描述
*/
private String description;
public String getJobName() {
return jobName;
}
public void setJobName(String jobName) {
this.jobName = jobName;
}
public String getJobClassPath() {
return jobClassPath;
}
public void setJobClassPath(String jobClassPath) {
this.jobClassPath = jobClassPath;
}
public String getCronExpression() {
return cronExpression;
}
public void setCronExpression(String cronExpression) {
this.cronExpression = cronExpression;
}
public Integer getIsRun() {
return isRun;
}
public void setIsRun(Integer isRun) {
this.isRun = isRun;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getJobGroup() {
return jobGroup;
}
public void setJobGroup(String jobGroup) {
this.jobGroup = jobGroup;
}
public String getTriggerState() {
return triggerState;
}
public void setTriggerState(String triggerState) {
this.triggerState = triggerState;
}
public String getTriggerStateName() {
return triggerStateName;
}
public void setTriggerStateName(String triggerStateName) {
this.triggerStateName = triggerStateName;
}
}
TriggerStateEnum:
/**
* quartz 任务实时状态枚举
* @author hanxuetong
*
*/
public enum TriggerStateEnum {