2016-09-07 3 views
1

J'ai le client HystrixFeign et j'essaie d'obtenir la cause/exception dans mon implémentation de secours, parce que j'aimerais vraiment connaître la raison de la solution de repli pour résoudre le problème. l'appel de service a échoué. Mais les implémentations ci-dessous ne me causent pas la cause. Cela fonctionne très bien et le repli est appelé tout le temps. Mais je n'ai aucune idée pourquoi. Je suis nouveau à Feign et Hystrix. Mon application est écrite en Java il y a 1,6 ans et c'est une sorte d'appel d'amélioration. Donc, je ne peux pas aller pour toutes les expressions lambda.Problème lors de la récupération du client HystrixFeign

J'ai l'interface client défini comme ci-dessous

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

Mon FeignClientFacory est comme ci-dessous

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; 
     } 

    } 

} 

Répondre

0

Prendre le code de cas de test exemple retroApi du moyeu git feindre ouvert et commencer à modifier un par un a aidé Je répare le problème. Voici le code de travail.

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; 
    } 
} 

Assurez-vous de taper jeté l'usine de secours, tout en appelant la méthode cible HystrixFeign, parce que la classe met en œuvre à la fois Fallback votre interface client et le FallbackFactory.

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

Vous pouvez suivre la conversation de cette question [https://github.com/OpenFeign/feign/issues/458]