java - 使用Futures时Spring Boot超时

标签 java spring spring-boot future

我正在使用 Spring Boot 版本 2.0.6.RELEASE

我有以下API方法

    @RequestMapping(value = "/searchData", produces = { MediaType.APPLICATION_JSON_VALUE }, method = RequestMethod.GET)
public Future<List<DataEntryBean>> getSearchData() {

    return CompletableFuture.supplyAsync(() -> {

        List<DataEntryBean> dataList = dataService.getSearchData();

        return dataList;
    });
}

getSearchData 方法的运行时间大约为 40 秒。 30 秒后,我的代码超时,日志中显示以下消息:

Resolved [org.springframework.web.context.request.async.AsyncRequestTimeoutException]

并且返回以下 json 响应

{
  "timestamp": 1544094968149,
  "status": 503,
  "error": "Service Unavailable",
  "message": "No message available",
  "path": "/searchData"
}   

getSearchData() 方法继续执行并最终在日志中显示为完成。 如果我删除 Future 返回类型并仅返回一个列表 - 代码可以正常工作。 我已经尝试了以下属性,但遗憾的是没有成功。

spring.mvc.async.request-timeout=-1
server.connection-timeout=-1

有谁知道我需要做什么才能解决这个问题并仍然允许我返回 Future 类型?

谢谢 达米恩

最佳答案

非异步请求没有超时设置,因此当您删除 future 的返回类型时,异步请求将变为非异步请求,并且它可以正常工作。

spring.mvc.async.request-timeout 是异步请求的超时设置。

您可以将其设置为更大的数字,例如 60000,或者仅更改返回类型。

我不认为-1意味着异步请求没有超时,事实上没有办法为异步请求设置没有超时。

关于java - 使用Futures时Spring Boot超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53650303/

相关文章:

java - 响应已经提交。无法将响应发送到另一个 URL

spring-boot - 如何使用 flyway 和单数据库处理模块化 Spring 项目

java - Spring Data Couchbase findAll(可迭代)

java - MongoDB-Spring QuerydslPredicateExecutor问题

java - 如何将 Neo4j 节点转换为蓝图顶点?

java - 获取自定义 View 的ViewGroup(Layout)

JAVA 多重构造函数和 IF 与继承

java - 我的java代码没有错误但停在nextInt

java - spring boot "Whitelabel Error Page"无可用信息

java - 为什么Spring MVC会以404响应并报告“在DispatcherServlet中未找到带有URI […]的HTTP请求的映射”?