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();
}
}
}
探索不以困难而止,学习不以艰苦而终

浙公网安备 33010602011771号