it-swarm.com.de

How to say Hystrix, um für einige der Ausnahmen im Befehl Hystrix kein Fallback auszulösen

Wir haben die Hystrix-Funktionalität verwendet, indem wir die HystrixCommand-Klasse direkt erweitert haben. Bei einigen Geschäftsausnahmen wird jedoch die Fallback-Methode von hystrix ausgelöst.

Ich möchte nicht den Hystrix-Fallback für einige der geschäftsspezifischen Ausnahmen auslösen. Wie kann ich es ohne Anmerkung erreichen, die basiert?

Danke im Voraus..!

6
LazyGuy

Verwenden Sie den Annotation-Parameter ignoreExceptions

@HystrixCommand(ignoreExceptions = { BaseException.class, MissingServletRequestParameterException.class, TypeMismatchException.class })

Siehe https://github.com/Netflix/Hystrix/tree/master/hystrix-contrib/hystrix-javanica#error-propagation

Ich sehe, dass Sie den HystrixCommand erweitern, anstatt die Annotation zu verwenden, aber das spielt keine Rolle, setzen Sie einfach diese Eigenschaft im Befehl und es sollte den gleichen Effekt haben.

Leider wird ein Hystrix-Befehl von einem Builder-Muster erstellt, sodass Sie einige Hacking-Vorgänge ausführen müssen. Die ignoreExceptions wurden zu DefaultProperties.Java hinzugefügt, die im HystrixCommandBuilder verwendet werden

1
sercasti

Wenn Sie Ihre Logik in ein try/catch-Objekt einschließen und Ausnahmen in einer HystrixBadRequestException erneut auslösen, wird der Fallback nicht ausgelöst.

@Override
protected Object run() throws Exception {
    try {
        return //call goes here
    }
    catch (Throwable e) {
        //We wrap any exceptions in a HystrixBadRequestException because this way any other errors will not
        //trip the short circuit
        throw new HystrixBadRequestException("Exception thrown hystrix call", e);
    }
}

In den Dokumenten: http://netflix.github.io/Hystrix/javadoc/com/netflix/hystrix/exception/HystrixBadRequestException.html

Eine Ausnahme, die einen Fehler mit angegebenen Argumenten oder Zuständen darstellt und keinen Ausführungsfehler darstellt. Im Gegensatz zu allen anderen Ausnahmen, die von einem HystrixCommand ausgelöst werden, wird hierdurch kein Fallback ausgelöst, es wird nicht gegen Ausfallmetriken gezählt und der Leistungsschalter wird nicht ausgelöst.

ANMERKUNG: Dies sollte nur verwendet werden, wenn ein Fehler auf Benutzereingaben wie IllegalArgumentException zurückzuführen ist. Andernfalls wird der Zweck der Fehlertoleranz und des Fallback-Verhaltens außer Kraft gesetzt.

1
devo

Zwei Möglichkeiten dies zu tun.

  1. Verwenden der Annotation "HystrixCommand" und Angeben der Ausnahmetypen.

    @HystrixCommand(ignoreExceptions = { HttpStatusCodeException.class, JsonMappingException.class })
    
  2. Verwenden Sie "HystrixBadRequestException" und passen Sie den Code so an, dass nur wenige Ausnahmefälle oder Statuscodes ignoriert werden. Bei dieser Implementierung wird nach spezifischen Fehlercodes in Ausnahmen gesucht, die von Ihrem Backend-API-Vertrag erwartet werden, und es wird kein Hystrix-Fallback aufgerufen. Das Auslösen von "HystrixBadRequestException" zählt nicht als Hystrix-Fehler.

    @HystrixCommand(commandKey = "MyHystrixCommand", fallbackMethod = "myHystrixFallback", threadPoolKey = "ThreadPoolKey")
    public ResponseEntity<String> getServiceCallResponse(String serviceUrl, HttpEntity<?> entity) {
    ResponseEntity<String> resp = null;
    try {
    resp = restTemplate.exchange(serviceUrl, HttpMethod.POST, entity, String.class)
            .getBody();
    }
    catch(Exception e) {
        handleExceptionForHystrix("getServiceCallResponse", e);
    }
    return resp;
    }
    
    private void handleExceptionForHystrix(String function, Exception e) {
            if (e instanceof HttpStatusCodeException) {
                HttpStatus httpStatusCode = ((HttpStatusCodeException)e).getStatusCode();
                if(httpStatusCode.equals(HttpStatus.BAD_REQUEST) || httpStatusCode.equals(HttpStatus.INTERNAL_SERVER_ERROR)) {
                    throw new HystrixBadRequestException("Hystrix Bad Request Exception Occurred" + httpStatusCode, e);
                }
                throw new RuntimeException(function, e);
            }
            throw new RuntimeException(function, e);
        }
    
    
    public ResponseEntity<String> myHystrixFallback(String serviceUrl, HttpEntity<?> entity, Throwable hystrixCommandExp) {
            return new ResponseEntity<String>(HttpStatus.INTERNAL_SERVER_ERROR);
        }
    
0
Achu22