2011-09-20 9 views
8

Sto usando il plug-in quarzo con Grails 1.3.7. Ho bisogno di bilanciamento del carico/cluster di un'app server che utilizza processi al quarzo. Apparentemente questo è supportato, ma sto scoprendo che tutti i risultati di ricerca di Google e i collegamenti all'interno dei documenti sono infranti. Ho trovato alcuni esempi di Java grezzi, ma suppongo che Grails abbia un modo più serio per farlo. Tutto ciò di cui ho bisogno è un semplice esempio da utilizzare come modello. Capisco che ho bisogno di abilitare in qualche modo il quarzo a utilizzare JDBC per archiviare i lavori e gestire il blocco.Grails clustering quarzo jobs codice di esempio e config desiderato

Penso che un collegamento a un singolo campione lo farebbe. Ma letteralmente ogni volta che ho trovato qualcosa che sembra promettente indica un collegamento interrotto sul sito di terracotta. Praticamente ogni sito mi conduce qui: http://www.opensymphony.com/quartz/wikidocs/TutorialLesson9.html ma quando guardo il sito di terracotta vedo roba Java ma niente graal. Se Java è l'unico modo per farlo, così sia, ma sento che ci deve essere qualche esperienza nel graal su questo là fuori da qualche parte!

TIA.

risposta

13

Per raggruppare il plug-in Quartz in Grails, ci sono alcuni file che è necessario includere nel progetto. Innanzitutto, installa grails-app/conf/QuartzConfig.groovy e assicurati che l'opzione jdbcStore sia abilitata.

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

Successivamente, installare i file di configurazione di Hibernate relativi al database a cui ci si connetterà. Ad esempio, con Oracle, la base Hibernate XML di configurazione a 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> 

Il file effettivo quarzo-Hibernate SQL per questo esempio si chiamerà Quartz.oracle.hbm.xml e risiederà nella stessa directory. Questi file dovrebbero essere disponibili sul plug-in Quartz su GitHub (https://github.com/nebolsin/grails-quartz), sotto src/templates/sql. Si noti che questi script sembrano funzionare solo con DataSource create e create-drop, quindi sarà necessario creare manualmente le tabelle Quartz su un update, se non esistono già da una corsa precedente.

Creare un file grails-app/conf/quartz/quartz.properties, e modificare è quello di soddisfare le vostre esigenze di business:

/* 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 

nota della proprietà di cui sopra, è possibile impostare org.quartz.plugins nella configurazione Log4j di Config.groovy per registrare le informazioni innescare innesco di lavoro rilevante e. Penso che il livello info dovrebbe essere sufficiente.

Modificare o creare, scripts/_Events.groovy e aggiungere la seguente chiusura di modifica di guerra. Questo risolve un noto bug del plug-in Quartz per installare il quartz.properties corretto, anziché uno vuoto dal plug-in, nel file di guerra finale.

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") 
} 

E si dovrebbe essere fatto ...

P.S. Se si utilizza un database Oracle, aggiungere il seguente al BuildConfig.groovy nel blocco dipendenze, in modo da avere accesso ai driver di comunicazione quarzo-Oracle:

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

PPS i file SQL al link qui sopra sono solo l'SQL.Per farla in un file di ibernazione, solo circondano ogni singolo comando SQL con un nodo Hibernate database-object, in questo modo (ancora una volta w/Oracle esempio):

<?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> 

Il dialect-scope dice Hibernate con cui database dialetti la creazione ed eliminazione i nodi dovrebbero essere usati Puoi provare a lasciarlo fuori e vedere se funziona, altrimenti potresti dover aggiungere il dialetto MySql usato dal tuo Grails DataSource.

+0

Grazie mille per la risposta dettagliata. Questo sembra esattamente l'informazione che stavo cercando. Sto usando RDS di Amazon come DB che è MySQL. Grazie ancora. –

+0

Non riesco a trovare il file chiamato Quartz.mysql.innodb.hbm.xml. Ho trovato tables_mysql_innodb.sql, ma nel codice xml di esempio sopra implica che dovrei impostare –

+0

Non riesco a trovare il file chiamato Quartz.mysql.innodb.hbm.xml. Ho trovato tables_mysql_innodb.sql, ma nel codice xml di esempio sopra implica che dovrei impostare . Ho cercato tutto il codice estratto da github e non esiste un tale file xml. Mi scuso ma sono piuttosto nuovo a tutto questo. Il mio database è MySQL RDS di Amazon con InnoDB. Suppongo che dovrò approfondire la configurazione di Quarzo e di Hibernate per capirlo. Ho avuto una lunga giornata, forse quando guardo tutto questo la mattina avrà più senso! Thx –