class ExceptionRetryHandler implements RetryHandler {

        @Override
        public Object perform() throws Exception {
            boolean success = false;
            Object result = null;
            int retryCount = 0;
            while (!success) {
                try {
                    if (retryCount > 0) {
                        proxy.resetDelegate();
                    }
                    result = operation();
                    success = true;

                } catch (Exception ex) {
                    if (retryCount >= maxRetries || !isRetryable(ex)) {
                        throw ex;
                    }
                    postFailure(ex, retryCount);
                    try {
                        Thread.sleep(getRetryInterval(retryCount));
                    } catch (InterruptedException ex1) {
                        // no-op
                    }
                    retryCount = maxRetries < 0 ? maxRetries
                            : retryCount + 1;
                }
            }
            return result;
        }

        private  ExceptionRetryHandler();
        public  ExceptionRetryHandler(Class<?>[] exceptionClasses, ExceptionRetryingProxy proxy, RetrySchedule schedule, int maxRetries);

}