Почему у Camel's DefaultExceptionPolicyStrategy точное совпадение?

При моделировании родительского исключения Retryable и конкретных дочерних исключений мы обнаружили, что проверка onException на родительский класс Retryable не соответствует для дочерних элементов. DefaultExceptionPolicyStrategy верблюда делает точное соответствие на исключение после проверки isInstance. Это заставляет каждое пользовательское исключение быть явно добавленным с использованием блока onException. Что может быть причиной этого дизайнерского решения?

DefaultExceptionPolicyStrategy.filter ()

{
    return exceptionClass.isInstance(exception);
}

DefaultExceptionPolicyStrategy.findMatchedExceptionPolicy ()

if (filter(type, clazz, exception)) {
           ...
            // exact match then break
            if (clazz.equals(exception.getClass())) {
                candidate = type;
                candidateDiff = 0;
                break;
            }
           ...
}

При воссоздании аналогичного сценария обработки исключений в Java

package how.does.java.behave;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.netflix.hystrix.exception.HystrixTimeoutException;

public class TestJavaExceptionHierarchy {
    public static final Logger log = LoggerFactory.getLogger(TestJavaExceptionHierarchy.class);
    // Base retryable exception type
    public static class RetryableException extends Exception{
        public RetryableException(Exception exception) {
            super(exception);
        }
    }
    // Concrete circuit open exception to wrap Hystrix exception
    public static class CircuitOpenException extends RetryableException{
        public CircuitOpenException(Exception exception) {
            super(exception);
        }
    }

    public static void main(String[] args) {
        // Main route having OnExceptions defined
        try {
            // Hystrix EIP Fallback
            try {
                // Hystrix monitored endpoint takes too long...
                // Camel throws hystrix exception
                throw new HystrixTimeoutException();            
            }catch (Exception he) {
                // Hystrix EIP fallback kicks in
                // Wrap hystrix exception in CircuitOpenException and rethrow
                throw new CircuitOpenException(he);
            }
        }catch (RetryableException ce) {
            // First onException to catch RetryableException types
            log.debug("Caught Retryable Exception");
        }
        catch (Exception ce) {
            // Handle as unknown exception if no match above
            log.debug("Caught Unknown Exception");
        }
    }
}

Результат:

11:06:28.665 [main] DEBUG com.od.eai.services.eaiservice.TestJavaExceptionHierarchy - Caught Retryable Exception

"Catch (RetryableException ce)" может перехватить сообщение на основе иерархии наследования. При запуске через Camel "onException(Exception.class)" перехватывает сообщение, даже если оно находится ниже обработчика "onException(RetryableException.class)".

0 ответов

Другие вопросы по тегам