Hystrix命令在Hystrix环境中无法运行

4
我遇到了Hystrix命令的问题。如果hystrix包装方法的调用来自于类内部,则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

但是,如果我从类外调用相同的方法,我会看到它在 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")

有什么想法吗?
2个回答

2
这是Spring AOP的一个限制(Hystrix-Javanica基于AOP)。当您在本地调用方法时,它不会通过代理进行,因此它实际上不会在Hystrix环境中运行,而是像另一个方法一样运行。
但是,当您从类外部调用时,它会通过代理进行,因此它可以正常工作。
许多其他功能也是如此。另一个例子是@Cacheable。
当您从类外部调用时,Hystrix(Spring AOP)拦截调用并将其包装在自己的环境中。但是,当您在本地进行调用时,它无法拦截调用。

这是因为我正在使用Spring吗? - user1792899
不是因为Spring,而是因为Hystrix使用AspectJ来拦截调用。 - pvpkiran
3
@pvpkiran,被拒绝的编辑正在这里讨论:https://meta.stackoverflow.com/questions/362985/author-rejected-edit-actively-harms-readability。 - Peter Haddad
1
我认为这个答案有两个错误:(1) 根据Hystrix FAQ,该产品不使用AOP。(2) 即使它或其插件模块之一使用了AOP,AspectJ也不会像答案中提到的那样存在自我调用的限制,因为它不使用代理。该声明仅适用于Spring AOP,但永远不适用于AspectJ。 - kriegaex
@kriegaex。也许我的回答不够清晰。我会更新它。如果您查看此处的问题,您可以看到@HystrixCommand,它不是Hystrix-core的一部分。它们来自另一个名为hystrix-javanica(https://github.com/Netflix/Hystrix/tree/master/hystrix-contrib/hystrix-javanica)的模块。这使用AOP。 - pvpkiran
1
你有点晚了,我已经在Nándor的回答下面的评论中提到了Hystrix-Javanica。我还链接了关于如何使用AspectJ而不是Spring AOP进行配置的描述。即使在你更新后,你声称AspectJ是自调用问题的原因仍然是错误的。再次强调:AspectJ 不是问题,Spring AOP才是。只需使用AspectJ就可以愉快地工作了。我知道这一点,尽管没有尝试过,因为我知道AspectJ的工作原理。恕我直言:Nándor是正确的,你是错误的。 - kriegaex

2
与 @pvpkiran 的回答相反,这不是 AspectJ 的限制,而是 Spring AOP 的限制。Spring AOP 是一种通过代理尝试实现 AspectJ 子集 的解决方案,基于代理的方法导致在不通过代理进行调用时 通知不被调用
有关详细信息,请参见 Spring Framework 参考文档中的 Spring AOP 能力和目标 以及AOP 代理
另一方面,AspectJ 直接修改建议类的字节码,根本不涉及代理,并且不会受到基于代理的 Spring AOP 的限制。
在几乎所有方面,AspectJ 都优于 Spring AOP,因此我建议您从 Spring AOP 切换到 AspectJ(这并不需要放弃 Spring,因为 Spring 和 AspectJ 可以很好地协同工作)。

1
你关于Spring AOP自我调用限制与AspectJ的对比的说法是正确的,我无法更好地表达。但是你是否知道为什么Spring AOP在这里应该扮演任何角色呢?正如我在另一个答案下的评论中提到的那样,Hystrix默认情况下不使用AOP。 - kriegaex
@kriegaex,说实话我对Hystrix并不是很熟悉,我只是看到这个问题和其他答案,就想到了每十个关于AspectJ的问题都是相同的模式,因为人们会困惑他们是否真正使用了AspectJ或Spring AOP,或者这两种技术在第一时间有什么关系。我们也无法从OP中得出太多信息,因为它没有关于在Spring上下文中特定配置Hystrix的任何细节。但他的问题很可能是上面提到的问题 :) - Nándor Előd Fekete
我也从未使用过Hystrix。是的,也许@Pretty使用了某种Spring插件。在他/她添加更多细节到问题之前,我们只能猜测。 - kriegaex
1
我认为你不需要这样做,因为它最终会变成正确的答案。正如我所说,可能OP确实使用了某种Spring插件,她已经确认她正在使用Spring。我的假设是Hystrix-Javanica(基于AOP而不是Hystrix核心)来自Hystrix的“贡献”部分,直接或间接地通过Spring Cloud Netflix使用。前面的链接描述了如何使用Spring AOP或AspectJ配置Javanica。 - kriegaex
大家好,很抱歉回复晚了。我正在使用Spring AOP。 - user1792899
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接