如何在Spring中为每个请求的@Async方法添加延迟

时间:2019-05-21 20:16:11

标签: java spring spring-mvc asynchronous

我有一个服务班和一个DAO班。在DAO类中,我正在使用hibernate和JPA在DB中执行操作。我想在DAO类的@Async方法上添加一些延迟。

在每个异步调用之前,应该有一些延迟。如何在不增加服务等级延迟的情况下做到这一点?

注意:我不想在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 :(得分:0)

尽管您尝试实现目标的方法非常有争议,但这可以使用Spring Aspects来完成:

@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();
    }
}

答案 1 :(得分:0)

一旦遇到像您这样的问题,我就解决了将线程池大小修改为1的问题。 有助于避免在数据库中重复插入

@Bean
public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
    ThreadPoolTaskExecutor bean = new ThreadPoolTaskExecutor();
    bean.setCorePoolSize(1);
    bean.setMaxPoolSize(1);
    bean.setWaitForTasksToCompleteOnShutdown(Boolean.TRUE);
    return bean;
}