当前位置: 首页 > 知识库问答 >
问题:

使用Futures时Spring启动超时

桓瀚
2023-03-14

我使用的是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()方法继续执行,并最终在日志中显示为完成。如果我去掉未来返回类型,只返回一个列表,代码就能正常工作。我已经尝试了以下属性,但不幸的是没有成功。

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

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

谢谢达米安

共有2个答案

云曦之
2023-03-14

尝试将这两个属性设置为特定值,如60或120。此外,将<code>@enablesync@Async添加到方法中。

费星晖
2023-03-14

非异步请求没有超时设置,所以当您删除future返回类型时,异步请求就变成了非异步请求,并且工作正常。

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

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

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

 类似资料:
  • 有一个方面的未来,我不完全理解从官方教程参考。http://docs.scala-lang.org/overviews/core/futures.html scala中的期货是否有某种内置的超时机制?假设下面的示例是一个5GB的文本文件...“Implicits.global”的隐含范围最终会导致onFailure以非阻塞方式触发还是可以定义?如果没有某种默认的超时,这是否意味着成功或失败都不会触

  • 我对Spring Boot cassandra web应用程序有问题。随着数据的增长,它开始出现,现在它是一个非常常见的场景。 所有查询有时都不起作用,返回。几秒钟后它又开始工作了,几秒钟后它就不工作了。所以web应用程序不断返回或响应。相同的查询始终在中工作。 我正在使用: Spring启动启动程序 sping-boo-starter-data-cassandra#2.1.3 Cassandra

  • 我正在使用Spring Boot版本2.1.9。带有Web、会话、安全、jdbc和jpa启动器的RELEASE。在我的应用程序中一切正常,直到我尝试覆盖默认会话超时值,application.properties中有以下行: 如果添加这一行,在启动Spring时,我会得到以下错误: 我还尝试了不同的格式,如180s或PT180S,但都不起作用。根据Spring文档或同一文档的其他变体,只有整数的版

  • 我想对Spring数据使用ElasticSearch。我使用的是Spring 5、Spring Boot 2和ElasticSearch 7.4。Docker compose: 马文: 存储库: 配置: 和错误时启动应用程序: 引起:java.lang.NoSuchMEDError:org.springframework.http.HttpHeaders.(Lorg/springframe/uti

  • 我是一名spark Scala程序员。我有一份spark工作,其中包含完成整个工作的子任务。我想使用ToFutures并行完成子任务。一旦完成整个工作,我必须返回整个工作响应。 关于scala Futures,我听说一旦主线程执行并停止,其余线程将被终止,并且您将得到空响应。 我必须使用等待。结果以收集结果。但是所有的博客都告诉你应该避免等待。结果是,这是一个糟糕的做法。 正在使用等待。在我的案例

  • 我正试图在设备上启动我的应用程序。它正在模拟器上成功发射。 null null 会不会是带有代码签名的东西? 目前我已将其设置为“不编码签名”