Как добавить задержку в метод @Async для каждого запроса в Spring - PullRequest
0 голосов
/ 21 мая 2019

У меня есть класс обслуживания и класс DAO. В классе DAO я выполняю операции в БД, используя hibernate и JPA. Я хочу добавить некоторую задержку для метода @Async в классе DAO.

Перед каждым асинхронным вызовом должна быть некоторая задержка. Как я могу сделать это без добавления каких-либо задержек в классе обслуживания?

Примечание: я не хочу добавлять задержку в моем SearchService.java

SearchService.java

public void updateService(List<Map<String,Object>> req) {
      for(Map<String,Object> requestMap : req) {
            searchDao.saveEntity(requestMap);
      }
}

SearchDAO.java

@Async
@Retryable(value = Throwable.class, maxAttempts = REATTEMPT)
public void saveEntity(Map<String,Object> requestMap){
    // perform DB operations. insert or update in DB
}

Ответы [ 2 ]

0 голосов
/ 22 мая 2019

как только у меня возникла проблема, подобная вашей, и я решил ее, изменив размер пула потоков до 1, будет полезно избегать дублирования вставок в БД

@Bean
public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
    ThreadPoolTaskExecutor bean = new ThreadPoolTaskExecutor();
    bean.setCorePoolSize(1);
    bean.setMaxPoolSize(1);
    bean.setWaitForTasksToCompleteOnShutdown(Boolean.TRUE);
    return bean;
}
0 голосов
/ 22 мая 2019

Хотя метод, которым вы пытаетесь достичь своей цели, очень спорен, это можно сделать с помощью Spring Aspect:

@Aspect
@Component // make sure your @ComponentScan processes the package this class is placed at
public class DelayAsyncOperations {

    @Around("@annotation(async)")
    public Object delayAsync(ProceedingJoinPoint pjp) {
        Thread.sleep(1000);
        return pjp.proceed();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...