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.
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. –
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 –
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 –