小编hyn*_*ess的帖子

如何正确处理hystrix回退中的预期错误?

我们有一个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不是这样设计的?

java spring-boot hystrix spring-cloud

8
推荐指数
1
解决办法
7077
查看次数

在Spring 3中使用带有注释类的PropertyOverrideConfigurer

编辑:这里有一些解释为什么被接受的答案对我有用,可能对其他人来说可能是个问题.

在我的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)

java spring spring-mvc

4
推荐指数
1
解决办法
4972
查看次数

标签 统计

java ×2

hystrix ×1

spring ×1

spring-boot ×1

spring-cloud ×1

spring-mvc ×1