2017-06-07 5 views
0

Wir haben eine Java-Anwendung, die Quartz für die Planung von Jobs verwendet. Die von uns verwendete Quarzversion ist: quarz-2.2.1Wiederholen Quartz Scheduler starten bei Datenbankverbindungsfehler

Die Quarzkonfiguration verwendet den JDBC-Jobspeicher.

Wenn die Datenbankverbindung nach unten ist (aufgrund des intermittierenden Netzausfalls) zum Zeitpunkt der Start-Methode Aufruf auf Quarz-Scheduler Objekt, schlägt es mit folgenden Ausnahme:

2017-05-28 00:05:45 org.quartz.SchedulerConfigException: Failure occured during job recovery. [See nested exception: org.quartz.JobPersistenceException: Couldn't recover jobs: The connection is closed. [See nested exception: com.microsoft.sqlserver.jdbc.SQLServerException: The connection is closed.]] 
2017-05-28 00:05:45  at org.quartz.impl.jdbcjobstore.JobStoreSupport.schedulerStarted(JobStoreSupport.java:692) 
2017-05-28 00:05:45  at org.quartz.core.QuartzScheduler.start(QuartzScheduler.java:567) 
2017-05-28 00:05:45  at org.quartz.impl.StdScheduler.start(StdScheduler.java:142) 

Um diese Quarz-Scheduler, um sicherzustellen, erfolgreich gestartet wurde, haben wir einen erneuten Versuch in unserem Code hinzugefügt, der nach jeder Sekunde einen Aufruf zum Starten der Methode auf dem Quarz-Scheduler-Objekt vornimmt. Wenn die Datenbankverbindung besteht, ist die Methode zum Starten des Aufrufs von quartz scheduler erfolgreich (es werden keine Ausnahmen ausgelöst), aber die zugeordneten Trigger, die sich in der Datenbank befinden, werden nicht gestartet, und es wird kein Job ausgelöst.

Irgendeine Idee, was könnte das Problem hier sein? Jede Hilfe soll geschätzt werden.

Hier ist die Quarz-Konfiguration Bitte beachten Sie, dass wir bereits Validierungsabfrage umgehen crappy Verbindungen (wegen intermittierenden Netzwerkausfall)

#============================================================================ 
# Configure Main Scheduler Properties 
#============================================================================ 

org.quartz.scheduler.instanceName = TestScheduler 
org.quartz.scheduler.instanceId = AUTO 
org.quartz.scheduler.skipUpdateCheck=true 

#============================================================================ 
# Configure ThreadPool 
#============================================================================ 

org.quartz.threadPool.class =  org.quartz.simpl.SimpleThreadPool 
org.quartz.threadPool.threadCount = 50 
org.quartz.threadPool.threadPriority = 5 

#============================================================================ 
# Configure JobStore 
#============================================================================ 

org.quartz.jobStore.misfireThreshold = 60000 
org.quartz.jobStore.maxMisfiresToHandleAtATime = 15 

org.quartz.jobStore.class =  org.quartz.impl.jdbcjobstore.JobStoreTX 
org.quartz.jobStore.driverDelegateClass =  org.quartz.impl.jdbcjobstore.StdJDBCDelegate 
org.quartz.jobStore.useProperties = false 
org.quartz.jobStore.dataSource = aBPM 
org.quartz.jobStore.tablePrefix = ABPM_ 
org.quartz.jobStore.isClustered = false 
org.quartz.jobStore.useDBLocks = false 
org.quartz.jobStore.acquireTriggersWithinLock = true 

#============================================================================ 
# Configure Datasources 
#============================================================================ 
org.quartz.dataSource.aBPM.driver = org.hsqldb.jdbcDriver 
org.quartz.dataSource.aBPM.URL = jdbc:hsqldb:file:embeddedDb/db/abpmquartz 
org.quartz.dataSource.aBPM.user = sa 
org.quartz.dataSource.aBPM.encryptPassword = yes 
org.quartz.dataSource.aBPM.password = fMFVvEFk3gFmM9ewWQkTNg== 
org.quartz.dataSource.aBPM.maxConnections = 55 
org.quartz.dataSource.aBPM.validationQuery= SELECT 1 
+0

Hallo Aman, es ist fast zwei Monate her, seit du diese Frage gepostet hast und ich habe sie beantwortet. Wenn Sie meine Antwort gefunden haben, wäre es nett von Ihnen, sie als akzeptiert zu markieren (der Check unter den Abstimmpfeilen). Vielen Dank! – walen

Antwort

0

Sie könnten ein Problem haben mit job misfires aktiviert haben.

TL; DR: Verwenden Sie beim Erstellen der Trigger entsprechende Fehlzündungsanweisungen, oder erhöhen Sie misfireThreshold.


Wenn der Scheduler war nach unten zu der Zeit waren die Auslöser soll Feuer, das ist eine Fehlzündung. Sobald der Scheduler aktiv ist, sucht Quartz nach fehlgesteuerten Jobs und sucht nach Anweisungen, was mit ihnen geschehen soll. Führen Sie sie sofort aus? Warte bis zur nächsten geplanten Feuerzeit? es wissen, was zu tun ist man entweder explizit sein kann misfire instructions durch die Verwendung oder den Standard nur auf Quartz des intelligente Politik, die auf dem Trigger-Typ abhängt (z CronTrigger hat eine andere Standardfehlzündung Politik als SimpleTrigger).

Leider fehlt das Kochbuch von Quartz etwas, wenn es darum geht, Fehlzündungsanweisungen zu erklären, und Sie sollen das JavaDoc für jede Unterklasse Trigger überprüfen, wenn Sie mehr wissen möchten.
Also dieser eine Typ schrieb einen Blog-Eintrag mit all misfire instructions and default misfire policies explained für Ihre Bequemlichkeit.

Sie haben uns nicht sagen, welche Art von Trigger Sie verwenden, aber Sie wollen wahrscheinlich zu umfassen Fehlzündung Anweisungen wie withMisfireHandlingInstructionFireNow(), die Ihren Job so schnell laufen wie der Scheduler nach oben.


Eine weitere Option ist gesetzt org.quartz.jobStore.misfireThreshold auf einen höheren Wert als das, was der Scheduler gestartet dauert.
Jetzt haben Sie es auf 1 Minute eingestellt. Das bedeutet, dass jeder Job, der weniger als 1 Minute später als seine erwartete Feuerzeit feuert, wird nicht als Fehlzündung betrachtet werden und wird nur gut ausgeführt werden. Bei Jobs, die mehr als 1 Minute zu spät sind, überprüft Quartz die Fehlzündungsrichtlinie.

Sagen Sie, dass der Scheduler immer weniger als 5 Minuten benötigt, um online zu gehen; Sie können dann versuchen, org.quartz.jobStore.misfireThreshold = 300000 festzulegen. Wenn die Jobs beim Scheduler-Start gestartet werden, sieht Quartz, dass sie für weniger als 5 Minuten zu spät gekommen sind und lassen sie einfach ausführen, ohne zuerst die Fehlzündungsrichtlinie zu überprüfen.

Verwandte Themen