2011-09-20 29 views
8

Używam pluginu kwarcowego z Grails 1.3.7. Mam potrzebę załadowania salda/klastrowania aplikacji serwerowej, która używa zadań kwarcu. Wygląda na to, że jest to obsługiwane, ale stwierdzam, że wszystkie wyniki wyszukiwania w Google i linki w dokumentach są zepsute. Znalazłem kilka surowych przykładów Java, ale założyłbym, że Grails ma bardziej groteskowy sposób na zrobienie tego. Potrzebuję tylko prostego przykładu użycia jako szablonu. Rozumiem, że muszę w jakiś sposób włączyć mechanizm kwarcowy, aby używać JDBC do przechowywania zadań i zarządzania blokowaniem.Grails klastrowanie kwarcowych zadań kod przykładowy i konfiguracja pożądana

Myślę, że zrobi to link do pojedynczej próbki. Ale dosłownie za każdym razem, gdy znalazłem coś, co wygląda obiecująco, wskazuje na zerwane łącze na stronie terakoty. Niemal każda strona ostatecznie mnie tutaj prowadzi: http://www.opensymphony.com/quartz/wikidocs/TutorialLesson9.html, ale kiedy patrzę na stronę z terakoty, widzę rzeczy w języku Java, ale nie grails. Jeśli Java to jedyny sposób na zrobienie tego, to niech tak będzie, ale wydaje mi się, że gdzieś tam musi być trochę wiedzy o grach!

TIA.

Odpowiedz

13

Aby zgrupować wtyczkę kwarcu w Grails, istnieje kilka plików, które należy uwzględnić w projekcie. Najpierw zainstaluj grails-app/conf/QuartzConfig.groovy i upewnij się, że jest włączona jdbcStore.

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

Następnie zainstaluj pliki konfiguracji hibernacji odpowiednie dla bazy danych, z którą chcesz się połączyć. Na przykład, z Oracle, baza hibernacji xml config w grails-app/conf/hibernate/hibernate.cfg.xml jest:

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

Rzeczywisty plik hibernacji Quartz-SQL dla tego przykładu będzie nazwany Quartz.oracle.hbm.xml i będzie się znajdować w tym samym katalogu. Pliki te powinny być dostępne w wtyczki Quartz na GitHub (https://github.com/nebolsin/grails-quartz), pod src/templates/sql. Zauważ, że te skrypty działają tylko dla DataSource create i create-drop, więc będziesz musiał ręcznie utworzyć tabele kwarcu na update, jeśli nie istnieją one już z poprzedniego uruchomienia.

Utwórz plik grails-app/conf/quartz/quartz.properties i edycji jest do potrzeb biznesowych:

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

Uwaga z powyższych właściwości, można ustawić org.quartz.plugins w konfiguracji Log4j z Config.groovy zalogować odpowiednią pracę i informacje spust wyzwalania. Myślę, że powinien wystarczyć poziom info.

Edytuj lub utwórz, scripts/_Events.groovy i dodaj następujące zamknięcie modyfikacji wojny. Naprawia to znany błąd wtyczki kwarcu, aby zainstalować poprawny quartz.properties, zamiast pustego z wtyczki, do końcowego pliku wojny.

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

i powinno być zrobione ...

PS: Jeśli używasz bazy danych Oracle, dodać następujące BuildConfig.groovy w bloku zależne, tak, że masz dostęp do sterowników komunikacyjnych Quartz-Wyrocznia:

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

PPS SQL plików w linku powyżej są tylko SQL.Aby uczynić go do pliku hibernacji, po prostu otoczyć każdego pojedynczego polecenia SQL z węzłem Hibernate database-object, tak jak (ponownie w/przykład Oracle):

<?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 mówi hibernacji, z którym Database dialektów tworzyć i spadku należy użyć węzłów. Możesz spróbować go opuścić i sprawdzić, czy działa, w przeciwnym razie będziesz musiał dodać dialekt MySql używany przez twój Grails DataSource.

+0

Dziękuję bardzo za szczegółową odpowiedź. To wygląda dokładnie na informację, której szukałem. Używam RDS Amazon jako DB, który jest MySQL. Dzięki jeszcze raz. –

+0

Nie mogę znaleźć pliku o nazwie Quartz.mysql.innodb.hbm.xml. Znalazłem tables_mysql_innodb.sql, ale w przykładowym kodzie xml sugeruje, że powinienem ustawić –

+0

Nie mogę znaleźć pliku o nazwie Quartz.mysql.innodb.hbm.xml. Znalazłem tables_mysql_innodb.sql, ale w powyższym przykładowym kodzie xml powinienem ustawić . Przeszukałem cały kod wyewidencjonowany z github i nie ma takiego pliku xml. Przepraszam, ale jestem całkiem nowy w tym wszystkim. Moja baza danych to Amazon RDS MySQL używający InnoDB. Przypuszczam, że będę musiał zagłębić się w konfigurację Quartz i Hibernate, aby to zrozumieć. Miałem długi dzień, być może kiedy spojrzę na to rano, będzie to miało więcej sensu! Thx –

Powiązane problemy