其他分享
首页 > 其他分享> > Springbot中给方法设置统一请求超时时间

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

 

标签:超时,请求,..,executorService,线程,new,throwable,Springbot,public
来源: https://www.cnblogs.com/fallmwu/p/15534818.html