DataStoreRepository 抛出哪种异常是超时还是停机?

问题描述 投票:0回答:1

我想对一些错误实施指数回退,这些错误由于 GCP 数据存储中的一些停机时间而很少出现。我的想法是使用@Retryable,但我只想捕获与超时或连接错误(5XX)相关的异常。

您知道哪种例外情况可以涵盖此情况吗?捕获所有 RuntimeExceptions 是我的第一个想法,但这太宽泛了,因此,这是一个坏主意。

我正在通过

com.google.cloud.spring.data.datastore.repository.DatastoreRepository

进行查询

因为这是一个罕见的错误,所以我手头没有日志来检查线索。我一直在研究,发现 DataAccessException 是一个通用的 RuntimeException,它涵盖了必须的 Spring Data 错误,但我认为我需要更细粒度的东西。

java spring-data-jpa spring-data google-cloud-datastore spring-retry
1个回答
0
投票

DatastoreRepository 对于任何运行时异常都会返回 DatastoreException。此异常涵盖此处描述的多个错误。

所以重要的是错误代码原因,DatastoreException类已经定义了哪些错误类型是可重试的:

private static final Set<Error> RETRYABLE_ERRORS =
  ImmutableSet.of(
      new Error(10, "ABORTED", false),
      new Error(4, "DEADLINE_EXCEEDED", false),
      new Error(14, "UNAVAILABLE", true));

如您所见,您无法直接访问这些内容。因此,为了能够验证是否抛出可重试错误,请在异常中使用 isReatryable() 方法。

因此,就我而言,我在 RetryListener 中验证了这一点,如果不可重试,我只需中断重试尝试:

@Component
@Slf4j
public class DatastoreExceptionListener implements RetryListener {

    @Override
    public <T, E extends Throwable> void onError(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {
        if (throwable instanceof DatastoreException ex) {
            log.error("Retry count: {} | Datastore Exception: {} - {} | Error location: {}",
                    context.getRetryCount(), ex.getCode(), ex.getReason(), context.getAttribute("context.name"));
            if (!ex.isRetryable()) {
                log.error("Non retryable DatastoreException, no further retries will be attempted");
                context.setExhaustedOnly();
            }
        }
        RetryListener.super.onError(context, callback, throwable);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.