Планирование задач весной - PullRequest
       36

Планирование задач весной

0 голосов
/ 22 февраля 2019

У нас есть требование, при котором мы должны собирать документы за Х минут в базе данных, где Х может быть 30-60.После того как эти документы собраны в базе данных, мы должны отправить их в отдельную службу через вызов REST.

Поскольку эти документы не будут очень большими, мы объединяем их вместе, а затем объединяем.

Теперь эти документы нужно отправить через определенный промежуток времени, поэтому я подумал о создании отдельного потока, который извлекает записи из базы данных, передает их в службу, и как только служба отвечает 200 OK, я удаляю эти записииз базы данных и поток переходит в спящий режим на X минут.

class PushDocumentsToService extends Thread{
    DocumentRepository documentRepository;
    DocumentProcessingService documentProcessingService
    public void run(){
        List<Document> list = documentRepository.getAllDocuments();
        Integer statusCode = documentProcessingService.sendDocuments(list);
        if(statusCode == 200)
            documentRepository.remove(list);
        try{
            Thread.sleep(30*60);
        }catch(..){..}
    }    

}

Теперь несколько моих коллег посоветовали мне не использовать Thread.sleep в моем коде.Я не могу понять вредные последствия

Thread.sleep ()

Кроме того, какие методы используют библиотеки и фреймворки, как Spring Scheduler и Google Guava для планированиязадача

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Если у вас есть библиотека Spring Scheduling в вашем classpath, добавьте аннотацию @Scheduled к методу, который вы хотите выполнить в течение определенного периода времени.Нет необходимости расширять Thread или внедрять Runnable;все это решается от вашего имени через Spring.

Вы знаете, пока приложение работает .

@Scheduled(cron = "30 * * * * *")
public void loadDataIntoRepository() {
    // your code
}

Это ill рекомендовал использовать Thread.sleep по нескольким причинам:

  • Поток, выполняющий ваш код , теперь заблокирован на время действияпериод сна.30 минут - это очень большой промежуток времени, чтобы заблокировать ваш поток.
  • Ваш поток может быть прерван, предлагая вам реальный способ восстановления после состояния ошибки..
  • Вам не нужно изобретать велосипед с расписанием, когда эта функциональность уже существует и уже хорошо протестирована для удобства обслуживания.
0 голосов
/ 22 февраля 2019

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

ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);    

Thread t1= new PushDocumentsToService();    
scheduledThreadPool.scheduleAtFixedRate(t1, 0, 30,TimeUnit.SECONDS);
...