Springbot中给方法设置统一请求超时时间

我们常常发现有一些接口访问时间超级长,占用大量的系统资源,我们为了系统的健康稳定发展,对一些接口都需要设置一个固定的请求响应时间。

以下为代码核心示例:

 

@Slf4j
@Aspect
@Component
public class RequestHandleAop {

  @Pointcut("execution(* com..*.service..*.*(..))")
  public void pointcut() {
  }

  @Around("pointcut()")
  @SneakyThrows
  public Object process(ProceedingJoinPoint joinPoint) {
    ExecutorService executorService = new ThreadPoolExecutor(1, 1,
        0, TimeUnit.SECONDS, new LinkedBlockingQueue<>());
    try {
      Future future = executorService.submit(() -> {
        try {
          return joinPoint.proceed();
        } catch (Throwable throwable) {
          log.error("方法内部执行异常", throwable);
          // 不可控的系统异常
          throw new Exception(throwable);
        }
      });
      return future.get(5L, TimeUnit.SECONDS);
    } catch (TimeoutException e) {
      // 可控的业务异常
      throw new RuntimeException("请求接口响应超时", e);
    } finally {
      /**
       * 线程池为单线程,所以无论超时与正常执行完都进行立即关闭线程池
       * 如果为多线程可能还需要判断是否还有未执行结束的线程,防止关闭线程池导致线程意外中断
       */
      executorService.shutdownNow();
    }
  }
}

 

posted @ 2022-06-08 18:25  今夕是何年?  阅读(390)  评论(0编辑  收藏  举报