Удостоверьтесь, что Кварцевое выполнение задания Spring не накладывается

Вы буквально хотите сравнить каждое изображение с другими? Каково приложение? Возможно, Вам просто нужны некоторая индексация и извлечение изображений на основе определенных дескрипторов? Тогда, например, можно посмотреть на стандарт MPEG-7 для Интерфейса Описания Мультимедийного контента. Тогда Вы могли сравнить различные дескрипторы изображения, которые будут не настолько точными, но намного быстрее.

46
задан Jordi Castilla 18 June 2015 в 12:17
поделиться

5 ответов

Если все, что вам нужно сделать, это запускать каждые 20 секунд, Кварц - серьезный перебор. java.util.concurrent.ScheduledExecutorService должно быть вполне достаточно для этого задания.

Служба ScheduledExecutorService также предоставляет две семантики для планирования. «фиксированная скорость» будет пытаться запускать ваше задание каждые 20 секунд независимо от перекрытия, тогда как «фиксированная задержка» попытается оставить 20 секунд между концом первого задания и началом следующего. Если вы хотите избежать перекрытия, лучше всего использовать фиксированную задержку.

31
ответ дан 26 November 2019 в 19:58
поделиться

поместить их в очередь

Даже если время превышает 20 секунд, текущее задание должно быть завершено, а следующее должно быть выбрано из очереди.

Или вы также можете увеличить время до некоторой разумной суммы.

0
ответ дан 26 November 2019 в 19:58
поделиться

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

Я бы исследовал ReadWriteLock s и позволил вашей задаче установить блокировку во время ее выполнения. Будущие задачи могут проверить эту блокировку и немедленно выйти, если старая задача все еще выполняется. По опыту я убедился, что это самый надежный способ подойти к этому.

Возможно, вы также создадите предупреждение, чтобы знать, что столкнулись с проблемами, и соответственно увеличить интервал времени?

2
ответ дан 26 November 2019 в 19:58
поделиться

Вы можете использовать семафор. Когда семафор занят, откажитесь от 2-го задания и дождитесь следующего срабатывания.

0
ответ дан 26 November 2019 в 19:58
поделиться

Quartz 1

Если вы измените свой класс для реализации StatefulJob вместо Job, Quartz позаботится об этом за вас. Из документации javadoc StatefulJob :

задания с отслеживанием состояния не могут выполнять выполнять одновременно, что означает новые триггеры, которые возникают до завершение метода execute (xx) будет отложено.

StatefulJob расширяет Job и не добавляет никаких новых методов, поэтому все, что вам нужно сделать, чтобы получить желаемое поведение, это изменить следующее:

public class YourJob implements org.quartz.Job {
    void execute(JobExecutionContext context) {/*implementation omitted*/}
}

На это:

public class YourJob implements org.quartz.StatefulJob {
    void execute(JobExecutionContext context) {/*implementation omitted*/}
}

Quartz 2

В версии 2.0 Quartz, StatefulJob устарел. Теперь вместо этого рекомендуется использовать аннотации, например

@DisallowConcurrentExecution
public class YourJob implements org.quartz.Job {
    void execute(JobExecutionContext context) {/*implementation omitted*/}
}
134
ответ дан 26 November 2019 в 19:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: