Using Quartz Scheduler in a cluster

Bookmark and Share
In a previous post, I described how to use Quartz scheduler for scheduling. In this post, I describe the configuration changes required for using Quartz Scheduler with Scheduling. Clustering currently only works with the JDBC-Jobstore (JobStoreTX
or JobStoreCMT). Features include load-balancing and job fail-over (if the JobDetail's "request recovery" flag is set to true). It is important to note that
  • When using clustering on separate machines, make sure that their clocks are synchronized using some form of time-sync service (clocks must be within a second of each other). See http://www.boulder.nist.gov/timefreq/service/its.htm.
  • Never fire-up a non-clustered instance against the same set of tables that any other instance is running against.
  • Each instance in the cluster should use the same copy of the quartz.properties file.
The following is an example of how to setup clustering. I implemented it as a stand-alone application. The same settings can be used in clusetered environment.
  1. Copy the source code from the example from the quartz example and add the follwing line to the QuartzTest.java class
    jobDetail.setRequestsRecovery(true);
    before adding jobDetail to the trigger. This is job failover.
  2. You have to add the following to the quartz.properties file:
    org.quartz.jobStore.isClustered = true
    org.quartz.jobStore.clusterCheckinInterval = 20000
    This sets up quartz for clustering
  3. Each server must have the same copy of the configuration file.
    org.quartz.scheduler.instanceId = AUTO
    To auto-generate instance ids.
  4. Create the data tables by using the sql scripts provided with the quartz download. The scripts are in the quartz\docs\dbTables directory.
When running the example, you can see the changes in DB in the SIMPLE_TRIGGERS and FIRED_TRIGGERS tables. The following is the quartz.properties file that I used. It has to be in the classpath.
#============================================================================
# Configure Main Scheduler Properties
#============================================================================
org.quartz.scheduler.instanceName = MyClusteredScheduler
org.quartz.scheduler.instanceId = AUTO
#============================================================================
# Configure ThreadPool
#============================================================================
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 25
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.oracle.OracleDelegate
org.quartz.jobStore.useProperties = false
org.quartz.jobStore.dataSource = myDS
org.quartz.jobStore.tablePrefix = QRTZ_

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

#============================================================================
# Configure Datasources
#============================================================================
org.quartz.dataSource.myDS.driver = oracle.jdbc.driver.OracleDriver
org.quartz.dataSource.myDS.URL = jdbc:oracle:thin:@localhost:1521:orcl
org.quartz.dataSource.myDS.user = scott
org.quartz.dataSource.myDS.password = tiger
org.quartz.dataSource.myDS.maxConnections = 5
org.quartz.dataSource.myDS.validationQuery=select 0 from dual
In order to use the datasources from your application server, change the datasource definition to the following
org.quartz.dataSource.myDS.jndiURL=jdbc/myDataSource
org.quartz.dataSource.myDS.java.naming.factory.initial=com.evermind.server.rmi.RMIInitialContextFactory
org.quartz.dataSource.myDS.java.naming.provider.url=ormi://localhost
org.quartz.dataSource.myDS.java.naming.security.principal=admin
org.quartz.dataSource.myDS.java.naming.security.credentials=123

{ 0 comments... Views All / Send Comment! }

Post a Comment