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

如何在Spring Boot REST API上设置超时?

景河
2023-03-14

我有一些可能需要一段时间才能执行的REST API,我想限制它们的执行持续时间。优选地,如果30秒过去了并且请求没有返回,我希望返回特定的HTTP代码/数据并完全终止该请求。

当前代码:

@RestController
@CrossOrigin(origins = {"*"}, maxAge = 4800, allowCredentials = "false")
public class APIController {

@RequestMapping(value = "/api/myapifunc", method = RequestMethod.POST, produces = "application/json")
public ResponseEntity<?> optimize(@RequestParam(value="param1", defaultValue="")) {
    // Code here
}

共有3个答案

仲孙宇定
2023-03-14
@RequestMapping(value = "/api/myapifunc", method = RequestMethod.POST, produces = 
"application/json")
public ResponseEntity<?> optimize(@RequestParam(value="param1", defaultValue="")) {
 return new Callable<String>() {
    @Override
    public String call() throws Exception {
        Thread.sleep(3000); //this will cause a timeout
        return "foobar";
    }
  };
}

未来你可以使用或注释< code > @ Timed @ Transactional(time out = 3000)

赵晟睿
2023-03-14

在Spring Boot 2.3/Tomcat 9中,您可以通过安装TomcatStuckThreadDetectionValve为所有传入的HTTP请求设置超时。以下是您需要的Spring配置代码(它是Kotlin):

import org.apache.catalina.valves.StuckThreadDetectionValve
import org.springframework.beans.factory.annotation.Value
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
import org.springframework.boot.web.server.WebServerFactoryCustomizer
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration

@Configuration
class RequestTimeoutConfiguration(
    @Value("\${app.tomcat.stuck-thread-detection.request-timeout.seconds}")
    private val stuckThreadTimeoutSeconds: Int
) {

    @Bean
    fun stuckThreadDetectionValve() =
        StuckThreadDetectionValve().apply {
            threshold = stuckThreadTimeoutSeconds
            interruptThreadThreshold = stuckThreadTimeoutSeconds
        }

    @Bean
    fun stuckThreadDetectionWebServerFactoryCustomizer(valve: StuckThreadDetectionValve) =
        WebServerFactoryCustomizer { factory: TomcatServletWebServerFactory ->
            factory.addContextValves(valve)
        }
}

然后你只需要application.properties中的属性来控制它:

app.tomcat.stuck-thread-detection.request-timeout.seconds=130
曾飞沉
2023-03-14

看起来您正在描述断路器模式。如果您可以控制客户端和服务器代码,并且想要探索Spring Cloud和NetflixHysterix库,您可以查看入门:断路器指南。

如果您使用Apache Tomcat作为您的servlet容器,您可以配置卡住的线程检测阀:

这个阀门允许检测需要很长时间处理的请求,这可能表明正在处理它的线程被阻塞了。此外,它可以选择性地中断这些线程,以尝试并解除对它们的阻塞。

当检测到这样的请求时,其线程的当前堆栈跟踪将写入具有WARN级别的Tomcat日志。

卡住线程的ID和名称可通过JMX在StuckThreadID和stuckThreadNames属性中获得。这些ID可以与标准线程JVM MBean(java.lang:type=Threading)一起使用,以检索关于每个卡住线程的其他信息。

 类似资料:
  • 我在我的项目中设置了一个RestTemplate和一个AsyncRestTemplate,如下所示: 我注意到连接超时实际上并不起作用,除非我将httpRequestFactory()bean更改为如下所示: 如果我将DEFAULT_READ_TIMEOUT_MILLISECONDS设置为5,则当我使用restTemplate时会发生超时(正如预期的那样)。但是,当我使用AsyncRestTemp

  • 问题内容: 我正在尝试在使用http.request且没有运气的HTTP客户端上设置超时。到目前为止,我所做的是: 有什么提示吗? 问题答案: 现在可以使用option和相应的request事件:

  • 问题内容: 情况 我有一个简单的python脚本来获取给定URL的HTML源: 有时,URL指向外部资源加载缓慢的页面(例如,视频文件或非常慢的广告内容)。 在完成请求之前,Webdriver将等待直到加载了这些资源。 注意:由于其他原因,我需要使用PhantomJS而不是或 问题 我想在PhantomJS资源加载上设置一个超时,以便如果资源加载时间太长,浏览器只会认为它不存在或其他原因。 这将允

  • 问题内容: 我目前从EntityManager查询中收到连接超时错误。是否可以为这些设置超时? persistence.xml 代码在我的线程的运行功能中超时: 我收到的超时错误: 问题答案: 是的,那里有 javax.persistence.query.timeout 。根据JPA 2.0规范,对此查询提示的支持是可选的: 可移植应用程序不应依赖此提示。根据使用的持久性提供程序和数据库,可能会或

  • 问题内容: 我org.springframework.ws.client.core.WebServiceTemplate用于拨打Web服务。如何为通话配置超时。 问题答案: 如果你使用的是Spring Webservices 2.1.0版本,则可以使用HttpComponentsMessageSender设置超时。 Spring不推荐使用CommonsHttpMessageSender,因此不再推

  • 我正在尝试在我的WebClient上设置超时,以下是当前代码: 我需要添加超时和池策略,我在想这样的事情: 但是我不知道如何在我的webclient中设置httpClient