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

如何在Spring AOP类中使用HystrixCommand

伍嘉
2023-03-14

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

@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里面方法太多,项目里面控制器太多。复制

@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()-

如果有人能提供解决方案,我将不胜感激。aop没有实施的解决方案也被接受,但绝对复制

共有1个答案

从劲
2023-03-14

既然这个问题还是没有回应,我就把自己的临时解决方案放在这里。

首先,在Springaop内部使用hystrix仍然不可行,因此唯一的努力是减少控制器端的感情。Hystrix 允许在 springboot application.properties 文件中进行默认超时设置,如下所示:

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

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

@HystrixCommand(fallbackMethod="fallback")

这在以下几点上仍然不够简洁:

> < li>

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

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

虽然仍然不像我解释的那样简洁,但这是我目前所能想到的。一旦我找到更好的解决方案,将执行更新。

 类似资料:
  • 一些日志记录需要在类的静态方法执行前后完成。我试图使用Spring AOP实现这一点,但它不起作用,对于普通方法来说,它是起作用的。请帮助我理解如何实现这一点,如果可以使用注释来完成,那就太好了。

  • 问题内容: 我已经用C ++实现了一个类。我想将其与Python一起使用。 请提出逐步方法,并详细说明每个步骤。 这样的东西 现在,在Python中 请提出建议。我该怎么办?注意:我想知道手动的方法。我不希望任何第三方库依赖。 问题答案: 查看Boost.Python。这是一个用C ++编写python模块的库。 还要研究SWIG,它也可以处理其他脚本语言的模块。我过去曾使用它来为我的课程编写模块

  • 我有以下三个类:我尝试制作1和2的例程,并使用tjava调用主类和来自1和2的方法,但我无法获取这些方法。 1) 我在Talend中为上面的代码(1)和2)做了例程,然后用tjava调用方法,但是不能这样做。我还尝试对所有的tjava都使用,并且在每个tjava上都做了onSubjob ok。我如何在Talend中调用这些类并调用方法呢?

  • 我有一个很大的问题,我不知道我是否错过了一些明显的东西或什么,但我不能发现我的错误。我有类SPN、A和B。我重载了2次operator=。我想将A类型或B类型作为参数传递。 它不会抛出任何错误。但是如果我在类B或A中尝试make operator(),则使用参数SPN,如下所示: 它会抛出SPN未命名类型的错误。我甚至不能在A类或B类中创建类SPN对象。也许它不是如何客观编程工作,所以我想得到它,

  • 主要内容:读者,前提条件,Spring AOP 概述Spring框架的关键组件之一是面向方面编程(AOP)框架。 面向方面的编程需要将程序逻辑分解成不同的部分。 此教程将通过简单实用的方法来学习Spring框架提供的AOP/面向方面编程。 读者 本教程主要是为Spring 面向方面编程(AOP)初学者准备的,帮助他们了解与Spring的AOP框架相关的基础到高级概念。 前提条件 在开始练习本教程系列文章中给出的各种类型的示例之前,我们假设您已经了解

  • 嗨, 我正在创建Rest API,这是我的问题。例如,我有这样的@Query。 如何从我的类OrderDto中获取值并将其发送到@查询? 我还有其他问题,例如,我只发送一个单词,在这里我只需要使用: orderId来使用incoming String,但不知道如何将其用于incoming类。有什么想法吗? 我只想用同样的例子,但是从OrderDto到userDto这样的类。getCustomer