Quartzs - JDBC-JobStore - Oracle 兑现 + Cluster

Quartzs -- JDBC-JobStore - Oracle 实现 + Cluster
  • 数据库

从%QUARTZ_HOME%/docs/dbTables中找对应的oracle脚本文件tables_oracle.sql。

在对应的quartz前缀前加上前缀TEST_

注:有两个INDEX的名字将超过30而报错。

  • 相关文件结构

Quartz(project name)

 |-src

     |-com.siyuan.test.quartz.conf

          |-quartz.xml

     |-com.siyuan.test.quartz.job

          |-LogJob.java

     |-frameworkx.springframework.scheduling.quartz

          |-BeanInvokingJobDetailFactoryBean.java

          |-MethodInvokingJobDetailFactoryBean.java

     |-quartz.properties

     |-quartz.sql

 |-WebContent

     |-WEB-INF

          |-web.xml

  • 相关文件

1)LogJob.java :必须实现java.io.Serializable

 

/**
 * LogJob.java
 *
 * Created on Sep 13, 2011, 11:41:00 AM
 * Copyright (c) 2001-2008 by G2X, Inc. All Rights Reserved.
 */
package com.siyuan.test.quartz.job;

import java.io.Serializable;

/**
 * This class
 *
 * @author Carro.zhu
 * @version $Revision$, $Date$, $Author$, $Name$
 */
public class LogJob implements Serializable{

 public void execute() {
  System.out.println("LogJob.execute : " + System.currentTimeMillis());
 }

}

 

2)quartz.xml

必须使用frameworkx.springframework.scheduling.quartz.BeanInvokingJobDetailFactoryBean

或者frameworkx.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean,

直接使用org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean会报java.io.NotSerializableException异常,参考http://jira.springframework.org/browse/SPR-3797

 

shouldRecover 当Quartz服务被中止后,再次启动或集群中其他机器接手任务时会尝试恢复执行之前未完成的所有任务

 

overwriteExistingJobs 必须设置为TRUE,否则配置文件中的更新无法影响DB已存在的信息

通过NAME和GROUP识别

 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>

	<bean name="job" class="com.siyuan.test.quartz.job.LogJob"></bean>
	
	<bean name="jobDetail"
		class="frameworkx.springframework.scheduling.quartz.BeanInvokingJobDetailFactoryBean">
		<property name="targetBean" value="job" />
		<property name="targetMethod" value="execute" />
		<property name="group" value="scheduler" />
		<!-- 
		<property name="shouldRecover" value="true" />
		 -->
	</bean>
	
    <bean name="trigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail" ref="jobDetail" />
        <property name="cronExpression" value="0/2 * * * * ?" />
        <property name="name" value="trigger" />
        <property name="group" value="scheduler" />
    </bean>
	
	<bean name="scheduler"
		class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<ref bean="trigger" />
			</list>
		</property>
		<property name="configLocation" value="classpath:quartz.properties"/>
		<!-- 
		<property name="overwriteExistingJobs" value="true" />
		 -->
	</bean>
	
</beans>

  

3)quartz.properties

 

#============================================================================
# Configure Main Scheduler Properties
#============================================================================

org.quartz.scheduler.instanceName = Scheduler
org.quartz.scheduler.instanceId = AUTO

#============================================================================
# Configure ThreadPool
#============================================================================

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 5
org.quartz.threadPool.threadPriority = 5

#============================================================================
# Configure JobStore
#============================================================================

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.oracle.OracleDelegate
org.quartz.jobStore.dataSource = quartz
org.quartz.jobStore.tablePrefix = TEST_QRTZ_
org.quartz.jobStore.misfireThreshold = 10000

#============================================================================
# Configure Cluster
#============================================================================

#org.quartz.jobStore.isClustered = true
#org.quartz.jobStore.clusterCheckinInterval = 20000

#============================================================================
# Configure DataSource
#============================================================================

org.quartz.dataSource.quartz.driver = oracle.jdbc.driver.OracleDriver
org.quartz.dataSource.quartz.URL = jdbc:oracle:thin:@desktop16:1521:orcl
org.quartz.dataSource.quartz.user = spaprod_01
org.quartz.dataSource.quartz.password = change
org.quartz.dataSource.quartz.maxConnections = 5
org.quartz.dataSource.quartz.validationQuery = SELECT 1 FROM DUAL

  

4)web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">
	<display-name>quartz</display-name>

	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
            classpath:com/siyuan/test/quartz/conf/*.xml
        </param-value>
	</context-param>

	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
</web-app>

 

5)BeanInvokingJobDetailFactoryBean/MethodInvokingJobDetailFactoryBean...

参考附件

  • 集群

将quartz.properties中的集群部分注释去除即可

集群测试:将包含上述文件的项目分别运行在同一机器上的不同TOMCAT下,运行同一TOMCAT下也可。