2016-09-07 25 views
1

我有HystrixFeign客户端,我试图在我的回退实现中获取原因/异常,因为我真的想知道回退的原因,因此我可以解决问题,为什么服务呼叫失败。 但下面的实现并没有让我成为原因。这工作得很好,而后备却一直在被调用。但我不知道为什么。我是Feign和Hystrix的新手。我的应用程序是在1.6年前用java编写的,这是一种增强型调用。所以我不能去任何lambda表达式。在HystrixFeign客户端回退中获取原因的问题

我有像下面

public interface MyServiceFeignClient { 
     @RequestLine("POST /myService/order") 
     @Headers("Content-Type:application/vnd.org.company.domain.order+json;version=1.0") 
     ServiceResponse sendOrder(String content); 
} 

我FeignClientFacory是像下面

public class FeignClientFactory { 

    private static final Logger LOG = LoggerFactory.getLogger(FeignClientFactory.class); 

    private String serviceUrl; 

    public FeignClientFactory(final String serviceUrl) { 
     this.serviceUrl = serviceUrl; 
    } 

    public MyServiceFeignClient newInstance() { 
     return HystrixFeign.builder() 
      .decoder(new GsonDecoder()) 
      .target(MyServiceFeignClient.class, serviceUrl); 

    } 

    class ClientFallbackFactory implements MyServiceFeignClient, FallbackFactory<ClientFallbackFactory> { 

     final Throwable cause; 

     public ClientFallbackFactory() { 
      this(null); 
     } 

     ClientFallbackFactory(Throwable cause) { 
      this.cause = cause; 
     } 
     // note that this method is not getting called at all 
     @Override 
     public ClientFallbackFactory create(Throwable cause) { 
      if (cause != null) { 
       String errMessage = StringUtils.isNotBlank(cause.getMessage()) ? cause.getMessage() : "unknown error occured"; 
       LOG.debug("Client fallback called for the cause : {}", errMessage); 
      } 
      return new ClientFallbackFactory(cause); 

     } 
     // everytime this method is called as fallback and the cause is just null 
     @Override 
     public ServiceResponse sendOrder(String content) { 
      LOG.debug("service client api fallback called"); 
      ServiceResponse response = new ServiceResponse(); 
      String errMessage = (cause == null ? "service client api fallback called" : cause.getMessage()); 
      response.setErrorMessage(errMessage); 
      response.setResultStatus("WARN"); 
      return response; 
     } 

    } 

} 

回答

0

以从打开佯GIT中毂的retroApi示例测试用例码和开始修改逐个帮助定义的客户端接口我解决了这个问题。以下是工作代码。

public static class ClientFallbackFactory implements MyServiceFeignClient, FallbackFactory<ClientFallbackFactory> { 

    @Override 
    public ClientFallbackFactory create(Throwable cause) { 
     return new PRSClientFallback(cause); 
    } 

    final Throwable cause; // nullable 

    public ClientFallbackFactory() { 
     this(null); 
    } 

    ClientFallbackFactory(Throwable cause) { 
     this.cause = cause; 
    } 

    @Override 
    public PaymentRiskServiceResponse sendOrder(String content) { 
     String errorMessage = (cause == null) ? "No cause returned" : cause.getMessage(); 
     LOG.debug("Client fallback called : {} ", errorMessage); 
     MyServiceResponse response = new MyServiceResponse(); 
     response.setResultStatus("WARN"); 
     response.setErrorMessage("Client fallback called"); 
     return response; 
    } 
} 

确保类型转换的后备工厂,同时调用HystrixFeign目标方法,因为后备类实现两个客户端接口和FallbackFactory。

return HystrixFeign.builder() 
     .encoder(new JacksonEncoder(mapper)) 
     .decoder(new GsonDecoder()) 
     .target(MyServiceFeignClient.class, prsUrl, (FallbackFactory<ClientFallbackFactory>) new ClientFallbackFactory()); 

您可以跟踪这个问题[https://github.com/OpenFeign/feign/issues/458]

的谈话