Я работаю над приложением планирования с использованием Spring Boot (2.2.7.RELEASE) , Quartz Scheduler (2.3.2) . Приложение развернуто в кластере AWS ECS и работает в нескольких экземплярах EC2 в зависимости от нагрузки. Я использую базу данных AWS RDS Mysql и создал необходимые кварцевые таблицы. Я использовал следующий файл свойств кварца.

quartz.properties -

org.quartz.scheduler.instanceName = MyClusteredScheduler
org.quartz.scheduler.instanceId = AUTO
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 25
org.quartz.threadPool.threadPriority = 5
org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.useProperties = true
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.isClustered = true
org.quartz.jobStore.clusterCheckinInterval = 20000

Журнал запуска приложения -

2020-10-13 23:33:02.853  INFO 938 --- [           main] org.quartz.core.QuartzScheduler          : Quartz Scheduler v.2.3.2 created.
2020-10-13 23:33:02.856  INFO 938 --- [           main] o.s.s.quartz.LocalDataSourceJobStore     : Using db table-based data access locking (synchronization).
2020-10-13 23:33:02.858  INFO 938 --- [           main] o.s.s.quartz.LocalDataSourceJobStore     : JobStoreCMT initialized.
2020-10-13 23:33:02.859  INFO 938 --- [           main] org.quartz.core.QuartzScheduler          : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED'
Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
NOT STARTED.
Currently in standby mode.
Number of jobs executed: 0
Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.
Using job-store 'org.springframework.scheduling.quartz.LocalDataSourceJobStore' 
- which supports persistence. and is not clustered.

Проблема в том, что несколько экземпляров EC2 выполняют одно и то же задание одновременно. Из-за этого получается неправильный результат.

Может кто-нибудь, пожалуйста, дайте мне знать, что мне здесь не хватает? Что мне здесь нужно сделать, чтобы он работал в кластере ECS. Каждый раз, когда приложение Spring начинает работу, оно показывает сообщение журнала не кластеризовано .

0
Avijit 14 Окт 2020 в 02:09

1 ответ

Лучший ответ

Это было решено. Я добавил следующие детали конфигурации в файл application.properties и удалил файл quartz.properties

spring.quartz.job-store-type = jdbc
spring.quartz.properties.org.quartz.scheduler.instanceName = MyClusteredScheduler
spring.quartz.properties.org.quartz.jobStore.isClustered = true
spring.quartz.properties.org.quartz.scheduler.instanceId = AUTO
spring.quartz.properties.org.quartz.jobStore.useProperties = true
spring.quartz.properties.org.quartz.jobStore.tablePrefix = QRTZ_
spring.quartz.properties.org.quartz.jobStore.isClustered = true
spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval = 20000

Теперь пакетное задание отлично работает в ECS, и одновременно в кластере ECS выполняется только одно задание.

0
Avijit 17 Окт 2020 в 07:28