我遇到了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")
有什么想法吗?
答案 0 :(得分:2)
这是Spring AOP的限制(Hystrix-Javanica基于AOP) 当你在本地调用一个方法时,它不会通过代理,因此它并不真正在Hystrix环境中运行,而是像它是另一种方法一样运行。
但是当你从课外打电话时,它会通过代理,因此它可以工作。
许多其他功能也是如此。另一个例子是@Cacheable
当你从课堂外打电话时,Hystrix(Spring AOP)拦截了这个电话并将它包裹在自己的环境中。但是当你在本地进行呼叫时,它无法拦截呼叫。
答案 1 :(得分:2)
与@ pvpkiran的回答相反,这不是AspectJ的限制,而是Spring AOP的限制。 Spring AOP是一种尝试通过代理实现AspectJ的子集的解决方案,而基于代理的方法是在不通过代理进行调用时导致建议未被调用的原因
有关详细信息,请参阅Spring Framework Reference中的Spring AOP capabilities and goals和AOP Proxies。
另一方面,AspectJ直接修改建议类的字节码,根本不涉及代理,并且不受基于代理的Spring AOP的限制。AspectJ在Spring AOP的各个方面都非常出色,所以我建议你从Spring AOP切换到AspectJ(因为Spring和AspectJ可以很好地协同工作,所以你不需要抛弃Spring)