Java后端太久前端请求超时处理方式及其代码
时间: 2023-09-05 10:07:44 浏览: 265
Java 后端处理前端请求超时可以有多种方式,下面介绍一种基于 Spring 框架的实现方法:
1. 在 Controller 层加上 @RequestMapping 注解时,可以设置请求的超时时间,例如:
```
@RequestMapping(value = "/api/getData", method = RequestMethod.GET, timeout = 5000)
public ResponseEntity<?> getData() {
// 处理请求并返回数据
}
```
上面的代码中,timeout 参数设置了请求的超时时间为 5 秒。如果请求超时,会抛出 java.util.concurrent.TimeoutException 异常。
2. 如果需要对所有请求都设置超时时间,可以使用 Spring 的拦截器(Interceptor)来实现。具体实现方式如下:
创建一个拦截器类 TimeoutInterceptor:
```
public class TimeoutInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
RequestMapping requestMapping = handlerMethod.getMethodAnnotation(RequestMapping.class);
if (requestMapping != null && requestMapping.timeout() > 0) {
// 设置请求超时时间
request.setAttribute("timeout", requestMapping.timeout());
}
}
return true;
}
}
```
在拦截器中,判断请求的处理方法是否设置了超时时间,如果设置了,则在 request 对象中设置一个名为 "timeout" 的属性,将超时时间保存在其中。
在 Spring 配置文件中注册拦截器:
```
<mvc:interceptors>
<bean class="com.example.TimeoutInterceptor" />
</mvc:interceptors>
```
这样,所有请求都会被拦截器处理,如果请求处理方法设置了超时时间,将会在 request 对象中保存该属性。
在 Controller 中,可以通过 request.getAttribute("timeout") 获取请求的超时时间,然后使用 ExecutorService 来执行该请求,设置超时时间并在超时后取消任务:
```
@RequestMapping(value = "/api/getData", method = RequestMethod.GET)
public ResponseEntity<?> getData(HttpServletRequest request) {
int timeout = (int) request.getAttribute("timeout");
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<?> future = executor.submit(() -> {
// 处理请求并返回数据
});
try {
future.get(timeout, TimeUnit.MILLISECONDS);
} catch (TimeoutException e) {
future.cancel(true);
return ResponseEntity.status(HttpStatus.REQUEST_TIMEOUT).build();
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
} finally {
executor.shutdown();
}
}
```
上面的代码中,使用 ExecutorService 来执行请求处理方法,并设置超时时间。如果超时,会抛出 TimeoutException 异常,并取消任务。如果请求处理方法抛出其他异常,则返回 500 错误码。
这样,就实现了在 Java 后端处理前端请求超时的方法。
阅读全文