Hystrix 命令在 Hystrix 环境中不 运行

Hystrix command does not run in Hystrix environment

我的 Hystrix 命令有问题。如果对 hystrix 包装方法的调用来自 class,hystrix 包装方法在 Hystrix 环境

中不会 运行

在那种情况下,我将日志视为

05-02-2018 22:51:25.809 [http-nio-auto-1-exec-3] INFO  c.i.q.v.e.ConnectorImpl.populateFIDSchema -
    populating FID Schema

但是,如果我从 class 外部调用相同的方法,我会在 Hystrix 环境 运行 中看到它

 05-02-2018 22:54:53.735 [hystrix-ConnectorImpl-1] INFO  c.i.q.v.e.ConnectorImpl.populateFIDSchema -
    populating FID Schema

我像这样用 HystrixCommand 包装我的方法

 @HystrixCommand(commandKey = "getSchemaCommand", fallbackMethod = "getSchemaCommandFallback")

有什么想法吗?

这是Spring AOP(Hystrix-Java基于AOP)的限制。
当你在本地调用一个方法时,它不会通过代理,因此它在 Hystrix 环境中并不是真正的 运行,而是 运行 就好像它是另一个方法一样。

但是当您从 class 外部拨打电话时,它会通过代理,因此可以正常工作。

许多其他功能也是如此。另一个例子是 @Cacheable

当您从 class 外部调用时,Hystrix(Spring AOP)会拦截调用并将其包装在自己的环境中。但是当你在本地调用时,它无法拦截调用。

与@pvpkiran 的回答相反,这不是 AspectJ 的限制,而是 Spring AOP 的限制。 Spring AOP 是一种尝试通过代理实现 AspectJ 的 子集 的解决方案,而基于代理的方法是导致 建议在调用不是通过代理进行的.

有关详细信息,请参阅 Spring 框架参考中的 Spring AOP capabilities and goals and AOP Proxies

另一方面,AspectJ 直接修改建议 class 的字节码,根本不涉及代理,并且不受基于代理的 Spring AOP 的限制。

AspectJ 在几乎所有方面都优于 Spring AOP,所以我建议您从 Spring AOP 切换到 AspectJ(您不需要放弃 Spring为此,Spring 和 AspectJ 可以很好地协同工作。