Sample Code and Grails Cluster Configuration Settings for Clusters

I am using a quartz plugin with Grails 1.3.7. I need to download a balance / cluster server application that uses quartz jobs. This seems to be supported, but I found that all search results and links in the documents are broken. I found some original Java examples, but I would suggest that Grails has a more graceful way to do this. All I need is a simple use case as a template. I understand that I need to somehow enable quartz in order to use JDBC to store jobs and manage locks.

I think a reference to one sample will do this. But literally every time I found something that looks promising, it points to a broken link to the terracotta site. Almost every site ultimately leads me here: http://www.opensymphony.com/quartz/wikidocs/TutorialLesson9.html , but when I look at a terracotta site, I see Java stuff, but not grails. If Java is the only way to do this, let it be, but I feel like there is some Grails experience somewhere!

TIA.

+8
cluster-computing grails quartz-scheduler
source share
2 answers

To group the Quartz plugin in Grails, you need to add some files to your project. First install grails-app/conf/QuartzConfig.groovy and make sure jdbcStore enabled.

 quartz { autoStartup = true jdbcStore = true waitForJobsToCompleteOnShutdown = true } 

Then install the Hibernate configuration files related to the database to which you will connect. For example, with Oracle, the basic xibernate xml configuration in grails-app/conf/hibernate/hibernate.cfg.xml :

 <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC '-//Hibernate/Hibernate Configuration DTD 3.0//EN' 'http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd'> <hibernate-configuration> <session-factory> <mapping resource="Quartz.oracle.hbm.xml"/> </session-factory> </hibernate-configuration> 

The actual Quartz-Hibernate SQL file for this example will be called Quartz.oracle.hbm.xml and will be in the same directory. These files should be available in the Quartz plugin on GitHub ( https://github.com/nebolsin/grails-quartz ) under src/templates/sql . Please note that these scripts only work for the DataSource create and create-drop , so you need to manually create the Quartz tables for update if they do not already exist from the previous run.

Create the grails-app/conf/quartz/quartz.properties and modify it to suit your business needs:

 /* Have the scheduler id automatically generated for * all schedulers in a cluster */ org.quartz.scheduler.instanceId = AUTO /* Don't let Quartz "Phone Home" to see if new versions * are available */ org.quartz.scheduler.skipUpdateCheck = true org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool /* Configure Quartz for only one thread as the only job * should run once per day */ org.quartz.threadPool.threadCount = 4 /* Give the thread a Thread.MIN_PRIORITY level*/ org.quartz.threadPool.threadPriority = 1 /* Allow a minute (60,000 ms) of non-firing to pass before * a trigger is called a misfire */ org.quartz.jobStore.misfireThreshold = 60000 /* Handle only 2 misfired triggers at a time */ org.quartz.jobStore.maxMisfiresToHandleAtATime = 2 /* Check in with the cluster every 5000 ms*/ org.quartz.jobStore.clusterCheckinInterval = 5000 /* Use the Oracle Quartz Driver to communicate via JDBC */ org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.oracle.OracleDelegate /* Have Quartz handle its own transactions with the database */ org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX /* Define the prefix for the Quartz tables in the database*/ org.quartz.jobStore.tablePrefix = QRTZ_ /* Tell Quartz it is clustered */ org.quartz.jobStore.isClustered = true /* Tell Quartz that properties passed to the job call are * NOT all String objects */ org.quartz.jobStore.useProperties = false /* Detect the jvm shutdown and call shutdown on the scheduler */ org.quartz.plugin.shutdownhook.class = org.quartz.plugins.management.ShutdownHookPlugin org.quartz.plugin.shutdownhook.cleanShutdown = true /* Log the history of triggers and jobs */ org.quartz.plugin.triggerHistory.class = org.quartz.plugins.history.LoggingTriggerHistoryPlugin org.quartz.plugin.jobHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin 

Pay attention to the above properties, you can set org.quartz.plugins in the Log4j Config.groovy to register the corresponding task and trigger trigger information. I think the info level should be sufficient.

Edit or create scripts/_Events.groovy and add the following closure to the war modification. This fixes the known Quartz plugin error to set the correct quartz.properties , and not empty from the plugin, to the final war file.

 eventCreateWarStart = { warName, stagingDir -> // Make sure we have the correct quartz.properties in the // correct place in the war to enable clustering ant.delete(dir:"${stagingDir}/WEB-INF/classes/quartz") ant.copy(file:"${basedir}/grails-app/conf/quartz/quartz.properties", todir:"${stagingDir}/WEB-INF/classes") } 

And you need to do ...

PS If you are using an Oracle database, add the following to BuildConfig.groovy in the dependency block so that you have access to the Quartz-Oracle communication drivers:

 runtime("org.quartz-scheduler:quartz-oracle:1.7.2") { // Exclude quartz as 1.7.3 is included from the plugin excludes('quartz') } 

PPS sql files from the link above is just SQL. To connect to the hibernation file, simply merge each individual SQL command using the Hibernate database-object node, like this (again w / Oracle example):

 <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-mapping PUBLIC '-//Hibernate/Hibernate Mapping DTD 3.0//EN' 'http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd'> <hibernate-mapping> <database-object> <create> CREATE TABLE QRTZ_JOB_DETAILS ( JOB_NAME VARCHAR2(200) NOT NULL, JOB_GROUP VARCHAR2(200) NOT NULL, DESCRIPTION VARCHAR2(250) NULL, JOB_CLASS_NAME VARCHAR2(250) NOT NULL, IS_DURABLE VARCHAR2(1) NOT NULL, IS_VOLATILE VARCHAR2(1) NOT NULL, IS_STATEFUL VARCHAR2(1) NOT NULL, REQUESTS_RECOVERY VARCHAR2(1) NOT NULL, JOB_DATA BLOB NULL, PRIMARY KEY (JOB_NAME,JOB_GROUP) ) </create> <drop>DROP TABLE QRTZ_JOB_DETAILS</drop> <dialect-scope name='org.hibernate.SomeOracleDialect' /> </database-object> ... <database-object> <create>INSERT INTO QRTZ_LOCKS VALUES('TRIGGER_ACCESS')</create> <drop></drop> <dialect-scope name='org.hibernate.SomeOracleDialect' /> </database-object> ... </hibernate-mapping> 

dialect-scope tells Hibernate to use the database to name the create and delete nodes. You can try to leave it and see if it works, otherwise you may have to add the MySql dialogs used by your Grails data source.

+13
source share

The accepted answer is a bit outdated. See this question for a simpler solution with later versions of Grails: Using grails data sources in a quartz plugin

0
source share

All Articles