Spring3.2.0和Quartz1.8.6集群配置
最近項目中要添加一個后臺任務處理的功能,要求做到集群,然后就調研了很多,網上也有好多資料,但在項目中應用時還是有很多問題,最終也找到了解決辦法,以下是完整實現。
首先是任務實現類,一個普通的service或bean:
public class EventMonitorService implements Serializable { private static final long serialVersionUID = 7026615035981953235L; private static final Logger LOG = LoggerFactory .getLogger(EventMonitorService.class); @Autowired private EventDao eventDao; @Autowired private SessionFactory sessionFactory; /** * 定時監控方法 */ public void startMonitorEvent() { LOG.debug("開始執行定時任務--監控Event超時"); //自己的業務處理 } }第二步,創建任務代理類DetailQuartzJobBean
import java.lang.reflect.Method; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; import org.springframework.scheduling.quartz.QuartzJobBean; import com.telematics.tsp.util.SpringContextKit; public class DetailQuartzJobBean extends QuartzJobBean { private static final Logger logger = LoggerFactory .getLogger(DetailQuartzJobBean.class); private String targetObject; private String targetMethod; private final ApplicationContext applicationContext; public DetailQuartzJobBean() { this.applicationContext = SpringContextKit.ME.getApplicationContext(); } @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { try { Object otargetObject = applicationContext.getBean(targetObject); System.out.println(otargetObject.toString()); Method m = null; try { m = otargetObject.getClass().getMethod(targetMethod, new Class[] {}); m.invoke(otargetObject, new Object[] {}); } catch (SecurityException e) { } catch (NoSuchMethodException e) { } } catch (Exception e) { throw new JobExecutionException(e); } } public void setTargetObject(String targetObject) { this.targetObject = targetObject; } public void setTargetMethod(String targetMethod) { this.targetMethod = targetMethod; } }
這里在獲取applicationContext時視項目框架而定,就是獲得應用上下文。
第三步,配置quartz.properties
#============================================================================
# Configure Main Scheduler Properties
#============================================================================
org.quartz.scheduler.instanceName = EventScheduler
org.quartz.scheduler.instanceId = AUTO
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
#============================================================================
# Configure JobStore
#============================================================================
org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
# mysql
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
# Oracle
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.oracle.OracleDelegate
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.maxMisfiresToHandleAtATime=10
org.quartz.jobStore.isClustered = true
org.quartz.jobStore.clusterCheckinInterval = 20000
第四步,配置quartz.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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 要調用的工作類 --> <bean id="eventMonitorService" class="demo.EventMonitorService"></bean> <!-- 定義任務 --> <bean id="vcaEventJobTask" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass"> <!-- 上面的任務代理類 --> <value>com.tservice.vca.jobtask.DetailQuartzJobBean</value> </property> <property name="jobDataAsMap"> <map> <!-- 實際的任務的Bean name,填上EventMonitorService的Bean name --> <entry key="targetObject" value="eventMonitorService" /> <!-- 執行Bean中的哪個方法 --> <entry key="targetMethod" value="startMonitorEvent" /> </map> </property> </bean> <!-- 任務觸發器 --> <bean id="eventTaskTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"> <!-- 任務代理Bean name --> <ref bean="vcaEventJobTask" /> </property> <property name="cronExpression"> <!-- 配置表達式,這里表示每五分鐘執行一次 --> <value>0 0/5 * * * ?</value> </property> </bean> <!-- 任務調度入口 --> <bean autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="dataSource"> <ref bean="dataSource" /> </property> <!-- 任務列表,可以配置多個任務加入到該List --> <property name="triggers"> <list> <ref local="eventTaskTrigger" /> </list> </property> <property name="configLocation" value="classpath:quartz.properties" /> </bean> </beans>接下來就可以正常啟動你的項目了。