我有一些可能需要一段时间才能执行的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
}
@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)
在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
看起来您正在描述断路器模式。如果您可以控制客户端和服务器代码,并且想要探索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