gpt4 book ai didi

java - 如何在 spring AOP 类中使用 HystrixCommand

转载 作者:行者123 更新时间:2023-11-30 10:22:13 25 4
gpt4 key购买 nike

在我当前的项目中,我需要使用 Hystrix 进行请求回退处理(主要是请求超时回退)。我测试了一个简单的案例,即将 @HystrixCommand 注释放在一个 spring rest Controller 方法之上,如下所示:

@RestController
public class xxxxxx {

@RequestMapping(value = "xxxxxxx")
@HystrixCommand(fallbackMethod="fallback", commandProperties = {
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "2000"),
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "2000")
})
public String xxxxxx(@RequestParam(value = "xxxx", required = true) String xxxx) {
....
return json.toString();
}

}

这很好用。 2 秒后触发超时,它进入我预定义的回退方法。现在问题来了:on controller里面的方法太多了,项目里面的controller太多了。逐个复制并粘贴 @HystrixCommand 方法不是一个好主意,我需要通过 spring aop 来实现它。然后我写了如下内容:

@Aspect
@Configuration
public class TimeoutMonitor {

@Pointcut("execution(xxxxxxxx)")
public void excuteService() {}

@Around("excuteService()")
@HystrixCommand(fallbackMethod="fallback", commandProperties = {
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "2000"),
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "2000")
})
public Object monitor(ProceedingJoinPoint pjp){
try {
Object output = pjp.proceed();
return output;
}catch(Throwable e) {
return null;
}
}

@HystrixCommand
public String fallback(ProceedingJoinPoint pjp) {
JSONObject json = new JSONObject();
json.put("message", "request timeout");
return json.toString();
}
}

而且它不工作......永远不会达到回退方法

在调试的时候,我已经确定了逻辑流程是excuteService()->monitor()->matched method的流程,已经过了2秒,但是fallback method一直没有到。我研究过这个问题,发现@HystrixCommand也是AOP实现的。我想将一个 aop 放在另一个 aop 中是导致这个问题的原因,但不幸的是我想不出解决它的方法。

如果有人能提供解决方案,我将不胜感激。非aop实现的解决方案也可以接受,但绝对不允许在每个方法上面复制粘贴@HystrixCommand。

最佳答案

由于这个问题还没有得到回应,所以我将自己的临时解决方案放在这里。

首先,在 spring aop 中使用 hystrix 仍然行不通,所以唯一的努力是减少对 Controller 端的影响。 Hystrix 允许在 springboot application.properties 文件中设置默认超时,如下所示:

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

这样一来,每个方法上面需要的注释就减少到只有一行:

@HystrixCommand(fallbackMethod="fallback")

这里还是有几点不够简洁:

  • 需要为每个方法复制/粘贴此注释

  • 需要在每个使用hystrix的地方复制/粘贴fallback方法

  • 对于hystrix回退方法本身,参数类型和数量需要与hystrix标记的方法完全相同。目前,我在每个 Controller 中为此使用了几种称为“回退”的重载方法

虽然还是没有我想象的那么简洁,但目前能想到的就这些了。一旦找到更好的解决方案,将执行更新。

关于java - 如何在 spring AOP 类中使用 HystrixCommand,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47435953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com