如何在Spring Boot中以AOP方式实现请求超时管理

如何在Spring Boot中以AOP方式实现请求超时管理,spring,rest,spring-boot,spring-aop,spring-async,Spring,Rest,Spring Boot,Spring Aop,Spring Async,目前,我正在探索“在Spring Boot中以AOP方式实现请求超时管理”的方法,但有几个限制。要求/限制规定如下: 最初的目的是,如果api请求的处理时间超过5秒,则直接返回超时结果,而不是继续处理 要监视的RESTAPI由标准spring mvc rest控制器实现。内部的所有API都返回json字符串,如下所示: @RestController public class xxxxxx { @RequestMapping(value = "xxxxxxx") public

目前,我正在探索“在Spring Boot中以AOP方式实现请求超时管理”的方法,但有几个限制。要求/限制规定如下:

  • 最初的目的是,如果api请求的处理时间超过5秒,则直接返回超时结果,而不是继续处理
  • 要监视的RESTAPI由标准spring mvc rest控制器实现。内部的所有API都返回json字符串,如下所示:

    @RestController
    public class xxxxxx {
        @RequestMapping(value = "xxxxxxx")
        public String xxxxxx(@RequestParam(value = "xxxx", required = true) String xxxx) {
            ....
            return json.toString();
        }
    }
    
  • 超时逻辑需要由AOP实现
  • (真正的中庸部分) 不应对控制器进行任何更改,这意味着:不应更改请求生成方法;不应更改返回类型(不允许“可调用”)

我已经找到了1个answer(),它可以完美地解决SpringAsync本身的问题,超时返回结果非常漂亮,但是它改变了返回类型,并且还涉及了控制器中的代码。我还发现了一个解决方案(),它使用AOP,但场景与我的完全不同。它已经将一些业务逻辑移动到AOP类中,但我不允许接触控制器代码。如果有人能提供解决方案,我将不胜感激。不能满足所有限制条件但能最大限度地减少差异的解决方案也被接受。

因为这个问题仍然没有答案,我将在这里提出我自己的临时解决方案

我正在使用Hystrix依赖项

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-hystrix</artifactId>
        <version>1.4.0.RELEASE</version>
    </dependency>
并且需要添加名称映射到注释内“fallbackMethod”值的回退方法:

public String fallback() {
   ...
}
超时时间值可以在application.properties内全局配置

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=3000
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=3000
这在以下几点上仍然不够简洁:

  • 需要为每个方法复制/粘贴此批注
  • 需要在使用hystrix的每个地方复制/粘贴回退方法
  • 对于hystrix回退方法本身,参数类型和编号需要与hystrix标记方法完全相同。目前,我在每个控制器中使用了几种称为“fallback”的重载方法
但至少它不再改变方法中的方法返回类型和代码,这是我目前能想到的最好的解决方案。一旦我找到更好的解决方案,我将执行更新

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=3000
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=3000