Пользовательское исключение не генерируется при использовании весенней аннотации `@ Retryable` - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь реализовать функциональность попыток повторных попыток при обработке исключения, используя spring-retry.Я использую @Retryable, как описано в моем примере кода ниже.Но здесь я сталкиваюсь со странной проблемой.

Когда я использую эту аннотацию, она повторяется 3 раза, что по умолчанию, но не выдает пользовательское исключение, т.е. MyGraphDBServiceException, которое я сделал для своего приложения.Вместо этого он выбрасывает ArrayIndexOutOfBoundException.Когда я удаляю эту аннотацию из метода, я получаю MyGraphDBServiceException, как и ожидалось.

Как я могу гарантировать, что MyGraphDBServiceException будет выдано, даже когда я использую эту аннотацию?

    @Override
    @Retryable(value = {MyGraphDBServiceException.class, MyGraphDBRedisServiceException.class}, backoff = @Backoff(delay = 1000))
    public Long beginTransaction() {
        //TODO: provide custom exception handling here
        if (configs.isEmpty())
            throw new MyGraphDBServiceException(SERVICE_UNAVAILABLE_EXCEPTION);

        Long txnId = null;
        List<TransactionObject> txnList = new LinkedList<>();
        try {
            //should throw exception here which should be MyGraphDBServiceException
            txnId = txnList.get(0).getTransactionId();
            Gson gson = new Gson();
            String txnString = gson.toJson(txnList);
            redisServiceUtility.add(String.valueOf(txnId), txnString);
        } catch (Exception e) {
            //TODO: provide custom exception handling here
            log.error("[Exception] Caught in redis: {}", e.getMessage());
            throw new MyGraphDBServiceException(SERVICE_UNAVAILABLE_EXCEPTION);
        }
        return txnId;
    }

просто для ясности, я получаю MyGrpahDBServiceException, когда я запускаю тот же кодно без @Retryable аннотации.Поэтому, пожалуйста, не думайте, что мой код должен выдавать ArrayIndexOutOfBoundException, а не пользовательский.

...