2016-08-17 2 views
10

J'ai un client feindre avec cet appel externe:Puis-je lancer une erreur personnalisée si un appel protégé par hystrix expire?

@RequestMapping(method = RequestMethod.GET, value = "GetResourceA", consumes = "application/json") 
@Cacheable("ResourceA") 
List<Stop> getResourceA() throws MyOwnException; 

Et dans mon application.yml je ce paramètre:

hystrix: 
    command: 
    default: 
     execution.isolation.thread.timeoutInMilliseconds: 1000 
     fallback.enabled: false 

Maintenant, si les temps getResourceA sur, soit il faut plus d'une seconde pour terminer , je reçois ce soit:

com.netflix.hystrix.exception.HystrixRuntimeException: getResourceA timed-out and no fallback available 

Ou, si je définis une solution de repli à partir de laquelle je jette ma propre exception, je reçois ceci:Puis-je ne pas lancer ma propre exception à partir de la solution de repli? Et si je souhaite lancer ma propre exception lorsque le service est arrêté? Je voudrais ne pas avoir de solution de repli (parce que je n'ai aucune valeur raisonnable pour revenir de la solution de repli), mais plutôt lancer ma propre erreur que je peux attraper et laisser reprendre le programme. Est-ce que quelqu'un peut m'aider avec ça?

mise à jour après la réponse de Ben:

J'ai donc essayé l'approche avec la capture HysterixRuntimeException et de vérifier ce qui a causé, mais a fini avec ce code laid:

try { 
    getResourceA(); 
} catch (HystrixRuntimeException e) { 
    if (e.getFailureType().name().equals("TIMEOUT")) { 
     throw new MyOwnException("Service timed out"); 
    } 
    throw e; 
} 

Tout ça pour être capable de lancer MyOwnException sur un timeout. Sûrement il doit y avoir un autre moyen?

Répondre

1

Vous devriez être en mesure d'obtenir l'exception que vous jetez de votre fallback en obtenant la cause de la HystrixRuntimeException

Alors, pour gérer votre exception personnalisée, vous pouvez le faire:

try { 
    getResourceA(); 
} catch (HystrixRuntimeException e) { 
    if (e.getCause() instanceof MyException) { 
     handleException((MyException)e.getCause()); 
    } 
} 
+0

Merci! C'est ce que je ferai à moins qu'il y ait une autre manière qui ne m'oblige pas à attraper la (hideuse) HystrixRuntimeException dans "mon propre code". – L42

+0

@ L42. Aucun problème. J'ai rencontré le même problème l'année dernière, et ce serait le meilleur que je pourrais trouver. Je serais heureux de voir si quelqu'un d'autre a une meilleure suggestion que je peux utiliser pour ranger les choses un peu :) –

+0

Je l'ai essayé et a fini par devoir faire ce qui suit afin de récupérer l'exception que je lance dans la méthode de repli: http: //pastebin.com/Dxw95kSB. Connaissez-vous une meilleure façon de le faire? – L42