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

RESTAPI请求超时

洪哲彦
2023-03-14

当没有响应返回时,我需要超时我的RESTAPI。例如,当我发出请求时,如果返回响应需要5秒钟以上,则超时。

为了实现这一点,我选择了使用Hystrix的断路器。但我不确定这是否是解决此问题的正确方法,如果一切都好,是否应该对Hystrix进行更多配置?

我当前的实现看起来像,

主类

@SpringBootApplication
@EnableCircuitBreaker
class MyApplication{

}

RestController

@GetMapping("/data")
@HystrixCommand(commandKey="response")
public String getResponse(){

    Thread.sleep(10000);
    .....
}

应用程序属性

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=5000

当超时时,它抛出一个HystrixRunTimeException,并由自定义异常处理程序处理。

这是实现请求超时的正确方法吗?

共有1个答案

阴飞星
2023-03-14

您可以简单地使用本机CompletableFuture,而无需为此添加外部依赖项:

CompletableFuture<String> task = CompletableFuture.supplyAsync(() -> {
    //your code which will return a String response at some point
});
try {
    return task.get(5, TimeUnit.SECONDS); //this will return if the future returns before 5 seconds, else will throw a timeout exception
} catch (InterruptedException | ExecutionException e) {
    //handle execution issues
} catch (TimeoutException e) {
    //you're called here if you timeout
}

方法CompletableFuture.supplyAsync()将异步执行使您检索字符串的任务,因此它应该包含您的函数代码。它应该以返回结束

另一方面,您将在之后获得未来,并且方法. get(Unit, timeoutUnit)将同步等待未来通过超时进行响应。

如果出现执行错误(例如,函数代码中抛出异常),您将在ExecutionException的原因中捕获它。

在超时的情况下(意味着未来在5秒之前还没有完成),您将捕获一个TimeoutException,并能够对您的呼叫方做出任何您想要的响应。

如果异步执行函数操作的线程被中断,也可能出现中断异常。我没有处理那个例外,你会比我更清楚你想如何处理它。

 类似资料:
  • 尝试使用PUT请求更新数据。但是,数据没有更新和返回邮递员中的以前的数据。 邮递员提出要求: 邮递员回复: 我也尝试过使用findByIdAndUpdate。没有得到结果。任何帮助都将不胜感激。 控制器: 路由器:

  • 我已经使用zappa在aws lambda上部署了一个flask应用程序,现在该应用程序在所有endpoint上都运行良好,除了我的主endpoint,当我对其发出post请求时,它返回{“消息”:“endpoint请求超时”} 真的需要一个修复或想法如何克服这个我需要调用分析路线,部署的url是 https://2ixfyfcsik.execute-api.eu-west-2.amazonaws

  • Middleware: 请求超时 请求超时控制也是不可或缺的中间件: <?php class RequestTimeout implements Middleware { public $timeout; public $exception; private $timerId; public function __construct($timeout, \Ex

  • HTTP/1.1 408 REQUEST_TIMEOUT内容-长度:0连接:关闭 已关闭 --------------------------------------------------------------------------------------- 它会导致请求超时。如果我使用curl命令,它是成功的。 请求超时的原因是什么?

  • 问题内容: 在我的Web应用程序中,有些请求的持续时间超过20秒。但是在某些情况下,代码可能会导致无限循环或类似事件,从而减慢服务器速度。 我想在服务器端放置60秒的请求超时。这是在tomcat中实现的吗? 问题答案: 使用Tomcat 7,你可以添加StuckThreadDetectionValve,这将使你能够识别“卡住”的线程。你可以在要进行检测的应用程序的Context元素中设置阀门: 这

  • 我在沙箱中工作,使用PayPal REST。net SDK方法支付。创建一个信用卡对象。当所有参数有效且使用来自的测试CC编号时https://developer.paypal.com/webapps/developer/docs/integration/direct/accept-credit-cards/,付款对象从该方法返回,一切正常。 但是,当参数无效时,例如过去的过期日期或沙箱无法识别的