SpringBoot控制接口超时设置:
超时三部曲 1.配置 2.接口定义 3. 异常处理
1.配置
提示:springboot项目设置接口超时时间(基本配置)
spring:
mvc:
async:
request-timeout: 2000 //单位是毫秒哦 2000代表2秒
配置不好用? 继续往下看啊
提示:如果想让配置生效,需要符合此配置对应的接口规范.
2.接口定义
提示:首先是异步的,需要单独开一个线程去执行.第二需要的返回值的是Callable<泛型>,泛型中是你真正要返回的数据类型.
/**
* 设置超时用的测试接口.通常如下写法
*
* @return 返回值一定是Callable<T>的.
*/
@GetMapping("/test")
public Callable<ResultVO> timeOutMethod() {
//new Callable<> 单独开启一个线程去执行
return new Callable<ResultVO>() {
@Override
public ResultVO call() throws Exception {
//这里将会触发超时
Thread.sleep(10000);
//正常返回逻辑
return ResultVO.response(ReturnEnum.PAY_TOP_UP_ORDER, String.valueOf(new IdWorker().nextId()));
}
};
}
提示:捕获AsyncRequestTimeoutException异常,进行统一的处理.
@ControllerAdvice //所有的Controller都会进入到这个类?
public class BaseExceptionAdvice {
@ExceptionHandler(AsyncRequestTimeoutException.class)
public ResponseEntity<JSONObject> handException(AsyncRequestTimeoutException e) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("timestamp", DateTime.now().toString("yyyy-MM-dd HH:mm:ss"));
jsonObject.put("status", 500);
jsonObject.put("message","接口超时");
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(jsonObject);
}
//往下还可以写很多的异常统一处理方法.上面只是写了超时异常的处理,其它无关主题的省略了.
}
测试结果
返回友好的超时报错.
还不明白?
看看这篇文章吧,需要自己用翻译器翻译一下https:///questions/34852236/spring-boot-rest-api-request-timeout
这个问题是工作时一个朋友遇到的,然后就问我了,我就去查阅资料了.
|