web-dev-qa-db-fra.com

La commande Hystrix échoue avec "expiré et aucune solution de secours disponible"

J'ai remarqué que certaines des commandes de mon application échouaient. 

Caused by: ! com.netflix.hystrix.exception.HystrixRuntimeException: GetAPICommand timed-out and no fallback available.
out: ! at com.netflix.hystrix.HystrixCommand.getFallbackOrThrowException(HystrixCommand.Java:1631)
out: ! at com.netflix.hystrix.HystrixCommand.access$2000(HystrixCommand.Java:97)
out: ! at com.netflix.hystrix.HystrixCommand$TimeoutObservable$1$1.tick(HystrixCommand.Java:1025)
out: ! at com.netflix.hystrix.HystrixCommand$1.performBlockingGetWithTimeout(HystrixCommand.Java:621)
out: ! at com.netflix.hystrix.HystrixCommand$1.get(HystrixCommand.Java:516)
out: ! at com.netflix.hystrix.HystrixCommand.execute(HystrixCommand.Java:425)
out: Caused by: ! Java.util.concurrent.TimeoutException: null
out: !... 11 common frames omitted

Voici mon remplacement de la configuration Hystrix:

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=210000
hystrix.threadpool.default.coreSize=50
hystrix.threadpool.default.maxQueueSize=100
hystrix.threadpool.default.queueSizeRejectionThreshold=50

Quel genre de timeout est-ce? S'agit-il d'un délai de lecture/connexion à l'application externe? Comment puis-je procéder pour déboguer cela?

16
dkulkarni

Il se peut que vous soyez en train de déboguer ou que votre connexion soit trop lente, le délai d’exécution du thread par défaut n’est que de 1 seconde. Vous pouvez donc facilement obtenir ce message si vous mettez un point de rupture dans votre commande.

Bien que ce ne soit pas votre cas, mais pourrait aider quelqu'un d'autre

11
xval

En regardant le stacktrace, il s'agit d'une exception levée par Hystrix après les 210 secondes définies ci-dessus. 

Comme TimeoutException est une exception vérifiée qui doit être déclarée sur chaque méthode susceptible de générer cette exception. Vous verriez ceci déclaré dans la méthode run() de votre code. 

Vous pouvez le déboguer comme n'importe quel autre programme, mais sachez que la méthode run() s'exécute dans un thread distinct de l'appelant. Après 210 secondes, l'appelant continuera simplement malgré votre session de débogage.

1
ahus1