Повторите попытку 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)

Чтобы гарантировать, что кварцевый планировщик запущен успешно, мы добавили повторение в наш код, который вызывает метод start для объекта кварцевого планировщика через каждую 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

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 поэтому, когда задания запускаются при запуске планировщика, Кварц видит, что они опоздали менее чем на 5 минут, и просто позволяет им выполняться без проверки политики пропуска зажигания.

Другие вопросы по тегам