Использование @DisallowConcurrentExecution в планировщике кварца - PullRequest
0 голосов
/ 27 апреля 2019

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

Из документов @DisallowConcurrentExecution имеет значение

  • Аннотация, помечающая класс {@link Job} как класс, который не должен иметь несколько экземпляров, выполняемых одновременно (где экземпляр основан на {@link JobDetail}определение - или другими словами, основанное на {@link JobKey}).

Но когда я планирую работу с тем же JobKey, я получаю Failed to schedule a job org.quartz.ObjectAlreadyExistsException

Если я генерируюдругой JobKey, он не учитывает @DisallowConcurrentExecution, и задание выполняется параллельно (как упомянуто в документации).

Пожалуйста, подскажите, как мне этого добиться, любые указатели действительно помогут!

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

1 Ответ

2 голосов
/ 29 апреля 2019

То же JobKey = та же работа.
Разное JobKey = разная работа.

Кварц не позволит вам использовать один и тот же JobKey более одного раза, потому что это будет две работы с одним и тем же ключом. Как два пользователя с одинаковым идентификатором.

Что вам нужно сделать, это запланировать разные JobTrigger s для того же JobKey.

@DisallowConcurrentExecution позволяет избежать перекрывающихся выполнений одного и того же задания . Если вы используете другой JobKey, это больше не та же работа, поэтому аннотация не имеет никакого эффекта. Но для данного JobKey с несколькими JobTrigger с, @DisallowConcurrentExecution будет препятствовать запуску нового запуска задания, если предыдущий еще не закончил.

Предлагаю взглянуть на документацию Quartz , чтобы глубже понять вышеуказанные концепции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...