Повторить запуск Quartz Scheduler при сбое подключения к базе данных

У нас есть приложение Java, которое использует Quartz для планирования заданий. Версия кварца, которую мы используем: кварц-2.2.1

Конфигурация кварца использует хранилище заданий JDBC.

Если соединение с базой данных не работает (из-за периодического сбоя сети) во время вызова метода start для объекта планировщика кварца, оно завершается со следующим исключением:

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)

Чтобы обеспечить успешный запуск кварцевого планировщика, мы добавили повтор в наш код, который вызывает метод запуска кварцевого планировщика через каждую 1 секунду. Но когда соединение с базой данных установлено, вызов метода запуска планировщика кварца выполняется успешно (он не генерирует никаких исключений), но связанные триггеры, находящиеся в базе данных, не запускаются, и задание не запускается.

Есть идеи, в чем здесь может быть проблема? Любая помощь будет оценена.

Вот конфигурация кварца, обратите внимание, что мы уже включили проверочный запрос для обработки дрянных соединений (из-за прерывистого сбоя сети)

#============================================================================
# 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

person Aman    schedule 07.06.2017    source источник
comment
Привет, Аман, прошло почти два месяца с тех пор, как вы опубликовали этот вопрос, и я ответил на него. Если вы нашли мой ответ чем-то полезным, было бы неплохо с вашей стороны отметить его как принятый (галочка под стрелками голосования). Спасибо!   -  person walen    schedule 02.08.2017


Ответы (1)


У вас может возникнуть проблема с ошибками задания. .

TL;DR: используйте соответствующие инструкции по осечке при создании триггеров или увеличьте misfireThreshold.


Если планировщик был отключен в то время, когда должны были сработать триггеры, это осечка. Как только планировщик запущен, Quartz проверяет невыполненные задания и ищет инструкции о том, что с ними делать. Запустить их немедленно? Ждать до их следующего запланированного времени пожара? Чтобы дать ему знать, что делать, вы можете явно указать, используя инструкции по пропуску зажигания или просто по умолчанию использовать умную политику Quartz, которая зависит от типа триггера (например, CronTrigger имеет другую политику пропуска зажигания по умолчанию, чем SimpleTrigger ).

К сожалению, в поваренной книге Quartz не хватает объяснений инструкций по осечкам, и если вы хотите узнать больше, вам предлагается проверить JavaDoc для каждого подкласса Trigger.
Итак, один парень написал запись в блоге с объяснены все инструкции по пропуску зажигания и политики по умолчанию для вашего удобства.

Вы не сообщили нам, какие триггеры вы используете, но вы, вероятно, хотите включить инструкции по пропуску срабатывания, такие как withMisfireHandlingInstructionFireNow(), который запустит ваше задание, как только планировщик заработает.


Другой вариант – установить для org.quartz.jobStore.misfireThreshold значение выше, чем то, которое требуется планировщику для запуска.
Сейчас у вас установлено значение 1 минута. Это означает, что любое задание, запускающееся менее позже чем на 1 минуту после ожидаемого времени запуска, не будет считаться осечками и будет выполняться нормально. Однако для заданий, которые опоздали более чем на 1 минуту, Quartz проверит для них политику осечек.

Скажем, вы знаете, что планировщик всегда подключается к сети менее чем за 5 минут; затем вы можете попытаться установить org.quartz.jobStore.misfireThreshold = 300000, поэтому, когда задания запускаются при запуске планировщика, Quartz видит, что они опоздали менее чем на 5 минут, и просто позволяет им выполняться, не проверяя сначала политику осечек.

person walen    schedule 08.06.2017