我们有一个Hystrix(1.4.x)命令,看起来像这样(使用Spring):
@HystrixCommand(groupKey = "GroupKey", commandKey = "CommandKey", fallbackMethod = "myFallback")
public List<X> findXs(long xId) {
return externalService.findXsExternally(xId);
}
Run Code Online (Sandbox Code Playgroud)
我们实际上不希望List从fallback方法返回一个(空),而是抛出一个异常,以便我们的调用者findXs知道它externalService已经关闭并且可以相应地采取行动.但与此同时,我们希望利用Hystrix提供的功能.在我们的例子中,我们希望调用者返回错误消息而不是返回列表.在Spring中,后备实现如下:
public List<X> myFallback(long xId) {
// What to do?? Throw exception!?
}
Run Code Online (Sandbox Code Playgroud)
从myFallback"作品"中抛出异常,但Hystrix会警告我们:
CommandKey失败并且回退失败.
即它会将此解释为后备失败.在我们的情况下,异常应不被解释为后备失败而是预期的行为.我们也尝试将抛出的异常包装在一个HystrixBadRequestException但是它似乎不适用于回退(根据文档,这将适用于"运行"方法).
如何在Hystrix中实现异常抛出的回退方法?我们可以安全地忽略警告,还是Hystrix不是这样设计的?
编辑:这里有一些解释为什么被接受的答案对我有用,可能对其他人来说可能是个问题.
在我的foo-app-servlet.xml中,我有这一行:
<context:component-scan base-package="com.foo.app" />
Run Code Online (Sandbox Code Playgroud)
当我之前使用spring2时,我的所有服务bean都来自applicationContext.xml,但现在它们直接被引入foo-app-servlet.xml.在我的项目中,servlet有自己的一组覆盖,因此我需要覆盖servlet覆盖文件而不是applicationContext覆盖文件.
覆盖时,如果你没有命名你的组件,那么它确实使用它的小写版本,所以要覆盖OrderService.foo,你这样做:
orderService.foo=bar
Run Code Online (Sandbox Code Playgroud)
结束编辑
我正在开发一个从spring 2.5升级到spring 3的项目,因此同时具有xml和基于注释的配置.我们以前使用PropertyOverrideConfigurer来更改不同环境中的属性,以取得巨大成功.我现在正在研究使用authorize.net的代码,我需要确保不从开发环境向他们发送任何内容.
为了实现这一点,我想用PropertyOverrideConfigurer覆盖我的'testMode'属性.这适用于通过xml配置的bean,但我无法弄清楚如何使用注释配置的类来完成它.
这是我在applicationContext.xml中的覆盖片段:
<bean class="org.springframework.beans.factory.config.PropertyOverrideConfigurer">
<property name="location" value="file:${user.home}/override.properties" />
<property name="localOverride" value="true" />
<property name="ignoreResourceNotFound" value="true" />
</bean>
Run Code Online (Sandbox Code Playgroud)
这是具有我要覆盖的属性的类:
@Component
public class OrderService {
private static Log logger = LogFactory.getLog(OrderService.class);
@Autowired @Qualifier("OrderDAO") private OrderDAO orderDao;
@Autowired private SiteManager siteManager;
String authorizenetProperties = "classpath:authorizenet.properties";
private Boolean testMode = false;
public Boolean getTestMode() {
return testMode;
}
public void setTestMode(Boolean testMode) {
this.testMode = testMode;
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试了一些不起作用的东西:
com.foo.services.OrderService.testMode=true
OrderService.testMode=true …Run Code Online (Sandbox Code Playgroud)