如何记录调用hystrix回退方法的原因

时间:2018-06-05 09:24:43

标签: spring-cloud hystrix netflix-feign feign

我正在使用Fiegn创建一个REST客户端。我的调用工作正常,但我想记录调用后备方法的异常情况 像这样的代码:

public interface FooService {
    Foo queryFoo(Integer fooId);
}

public interface FooServiceFallback implements FooService {
    @Override
    Foo queryFoo(Integer fooId) {
        return new Foo();
    }
}

@Configuration
public class FooServiceConfiguration {
    @Bean
    public FooService() {
        return HystrixFeign.builder().[...].target(FooService.class, "http://xxx", FooServiceFallback.class);
    }
}

发生异常时可以调用fallback方法,但会记录注释。

如何记录触发调用回退方法的异常?
像connectionTimeoutException一样。

1 个答案:

答案 0 :(得分:1)

Fallback方法可以采用类型为Throwable的额外参数,这将指示原因。

例如,如果您的方法是这样的

@HystrixCommand(fallbackMethod = "fallbackMethod")
public String mainMethod(String s) {
 .....
}

您的后备方法可以像这样

public String fallbackMethod(String s) {
     ......
}

public String fallbackMethod(String s, Throwable throwable) {
     //log the cause using throwable instance
     ......
}

在你的情况下使用第二个。

编辑:

如果您使用HystrixFeign,就是这样做的。您应该使用FallbackFactory

@Component
public class FooServiceFallbackFactory implements FallbackFactory<FooService> {

    @Override
    public FooService create(Throwable throwable) {
        return new FooServiceFallback(throwable);
    }

}

您的后备课程看起来像

@Component
public class FooServiceFallback implements FooService {

   private final Throwable cause;

   public FooServiceFallback(Throwable cause) {
      this.cause = cause;
   }

   @Override
   Foo queryFoo(Integer fooId) {
       //You have access to cause now, which will have the real exception thrown
   }

}

您还需要更改一下配置类

@Configuration
public class FooServiceConfiguration {
    @Bean
    public FooService() {
        return HystrixFeign.builder().[...].target(FooService.class, "http://xxx", FooServiceFallbackFactory.class);
    }
}