Как предотвратить перекрытие графиков весной?

StackOverflow https://stackoverflow.com//questions/24033208

  •  21-12-2019
  •  | 
  •  

Вопрос

@Scheduled(fixedDelay = 5000)
public void myJob() {
     Thread.sleep(12000);
}

Как я могу предотвратить запуск этого весеннего задания, если предыдущая процедура еще не завершена?

Это было полезно?

Решение

С fixedDelay, период измеряется после завершения работы, поэтому не беспокойтесь.

Другие советы

По умолчанию пружина использует однопоточный исполнитель. Таким образом, нет двух задач @ клученных задач никогда не совпадают. Даже два метода @ клученных метода в совершенно неродных классах не будут перекрывать просто потому, что есть только один нить для выполнения всех задач @scheduled.

Кроме того, даже если вы замените исполняющий исполнитель по умолчанию с помощью исполнителя на основе пула нитей, эти исполнители, как правило, будут задерживать выполнение экземпляра задачи до завершения ранее запланированного экземпляра. Это верно для FixeddeLay, фиксированных графиков на основе на основе CRON . Например, эта сторонняя конфигурация создаст struledthredtpoolexecutor , который использует ThreadPool, но не позволяет одновременному экземпляру того же графика, как вы желаете:

@Configuration
@EnableScheduling
...
public class MySpringJavaConfig {
    @Bean(destroyMethod = "shutdown")
    public Executor taskScheduler() {
        return Executors.newScheduledThreadPool(5);
    }
    ...
}
.

Вот то Javadoc для планируемогоTREDTREADPoolExecuture :: SchedulatfixedRate , который указывает:

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

Примечание. Эта функциональность не содержит true для @ASYNC задач . Весна создаст столько одновременных случаев тех, сколько необходимо (если в бассейне есть достаточные нити).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top