2016-09-07 9 views
1

У меня есть клиент HystrixFeign, и я пытаюсь получить причину/исключение в моей резервной реализации, потому что мне действительно хотелось бы узнать причину возврата, поэтому я могу исправить проблему, почему вызов службы не выполнен. Но приведенные ниже реализации не приносят мне причину. Это работает отлично, и резервное копирование постоянно называется. Но я не знаю, почему. Я новичок в Feign и Hystrix. Мое приложение написано в java 1.6 лет назад, и это своего рода призыв к повышению. Поэтому я не могу пойти на любые лямбда-выражения.Проблема в получении причины в резерве клиента 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

Беря пример тестового случая кода 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; 
    } 
} 

Убедитесь, что приведение типа завода Fallback, при вызове целевого метода 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]