Я работаю над приложением планирования с использованием 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 начинает работу, оно показывает сообщение журнала не кластеризовано .
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 выполняется только одно задание.
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.