【发布时间】:2019-06-02 11:42:44
【问题描述】:
我有一些 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
}
【问题讨论】:
-
this post上的一些好答案
-
为什么不在您正在使用的服务上设置适当的超时和回滚,而不是在不知道中止此类请求的含义的情况下在控制器级别进行全面“杀死”?
-
@jbx - 好问题。我们在该 REST 服务中使用了第三方,这可能需要很长时间才能执行。我对此没有任何控制权,因此我需要中止它以防执行时间过长,以确保此类事务不会导致服务器负载过高。
-
@jbs - 但你的问题让我想到,也许我们应该只限制该特定功能的执行,而不是整个控制器级别。谢谢你的评论,点赞! :)
-
@TomShir 欢呼。如果您使用 Spring 的
RestTemplate,您实际上可以将其配置为超时。 docs.spring.io/spring-boot/docs/current/api/org/springframework/… 如果需要,还有连接超时。如果该服务通常很慢,那么您可能想看看您是否可以并行运行它与您可能执行的不需要它响应的任何其他操作。
标签: java rest spring-boot timeout