2015-09-28 10 views
8

Czy istnieje sposób, aby uzyskać powód niepowodzenia HystrixCommand podczas korzystania z adnotacji @HystrixCommand w aplikacji Spring Boot? Wygląda na to, że jeśli zaimplementujesz swój własny HystrixCommand, masz dostęp do getFailedExecutionException, ale jak uzyskać dostęp do tego przy użyciu adnotacji? Chciałbym móc robić różne rzeczy w metodzie awaryjnej w oparciu o typ wyjątku, który wystąpił. czy to możliwe?Wyjątek niepowodzenia w metodzie zastępczej @HystrixCommand

Widziałem note o HystrixRequestContext.initializeContext() ale HystrixRequestContext nie daje Ci dostęp do wszystkiego, jest jakiś inny sposób na wykorzystanie tego kontekstu, aby uzyskać dostęp do wyjątków?

Odpowiedz

7

nie znalazłem sposobu na zdobycie wyjątek z adnotacjami albo, ale tworząc własne polecenia pracował dla mnie tak:

public static class DemoCommand extends HystrixCommand<String> { 

    protected DemoCommand() { 
     super(HystrixCommandGroupKey.Factory.asKey("Demo")); 
    } 

    @Override 
    protected String run() throws Exception { 
     throw new RuntimeException("failed!"); 
    } 

    @Override 
    protected String getFallback() { 
     System.out.println("Events (so far) in Fallback: " + getExecutionEvents()); 
     return getFailedExecutionException().getMessage(); 
    } 

} 

Mam nadzieję, że to pomoże ktoś inny również.

2

nie mogłem znaleźć sposób, aby uzyskać wyjątek z adnotacjami, ale znalazłem HystrixPlugins, z których można zarejestrować HystrixCommandExecutionHook i można dostać dokładnie to wyjątek w tak:

HystrixPlugins.getInstance().registerCommandExecutionHook(new HystrixCommandExecutionHook() { 
      @Override 
      public <T> void onFallbackStart(final HystrixInvokable<T> commandInstance) { 

      } 
     }); 

Instancja polecenia to GenericCommand.

+0

Ale to generycznie złapie je przy każdym wykonaniu polecenia i nie będzie powiązane z konkretnym wykonaniem polecenia poprawnie? Nie do końca byłem tym, czego szukałem, ale nadal mogłem być pomocny w niektórych przypadkach, gdy musisz wiedzieć o błędach. –

24

Po prostu dodaj parametr Throwable do metody rezerwowej i otrzymasz wyjątek, który został wygenerowany przez oryginalne polecenie.

Od https://github.com/Netflix/Hystrix/tree/master/hystrix-contrib/hystrix-javanica

@HystrixCommand(fallbackMethod = "fallback1") 
    User getUserById(String id) { 
     throw new RuntimeException("getUserById command failed"); 
    } 

    @HystrixCommand(fallbackMethod = "fallback2") 
    User fallback1(String id, Throwable e) { 
     assert "getUserById command failed".equals(e.getMessage()); 
     throw new RuntimeException("fallback1 failed"); 
    } 
1

Większość czasu po prostu używając getFailedExecutionException(). GetMessage() dał mi wartości null.

Exception errorFromThrowable = getExceptionFromThrowable(getExecutionException()); 
    String errMessage = (errorFromThrowable != null) ? errorFromThrowable.getMessage() 

daje to mi lepsze wyniki przez cały czas.

Powiązane problemy