Я пытаюсь реализовать функциональность попыток повторных попыток при обработке исключения, используя 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
, а не пользовательский.