4

我偶尔注意到我的 Drive SDK 调用会定期失败并出现 500 错误,重试请求通常会立即修复错误。查看 Google 文档,它建议使用指数退避技术,我编写了自己的实现,效果很好,但是在调试时我碰巧碰到接口 BackOffPolicy,经过更多调查,我什至发现了 ExponentialBackOffPolicy 实现。

因此,与其自己管理这个,我认为最好删除我的实现并让 SDK 为我做这件事。退避策略(据我所知)可以通过构建的 HTTP 请求设置,因此在手动构建请求或使用批处理请求时非常容易使用,但是在使用核心 SDK 时我似乎找不到最简单的注入位置,例如,如果我想为以下内容设置退避策略:

drive.files().get(id).execute();

我不能做类似的事情:

drive.files().get(id)
     .setBackOffPolicy(new ExponentialBackOffPolicy())
     .execute();

我需要这样做:

drive.files().get(id)
     .buildHttpRequest()
     .setBackOffPolicy(new ExponentialBackOffPolicy())
     .execute();

但是,如果我这样做,那么我还需要重现 Drive.Files.Get 的执行方法的解析逻辑并将结果转换为 File 对象,这显然不是一个理想的方法。是否有一种更简单的方法可以“一般”将其添加到请求中,或者是否有一种方法可以为所有请求设置默认退避策略?

如果没有,也许这可以被引入到 Drive SDK 的未来版本中?

谢谢,大卫

4

3 回答 3

2

Google Drive SDK 文档包含一个示例,展示了如何使用 Drive API 正确实现指数退避:

https://developers.google.com/drive/handle-errors

于 2012-10-08T23:29:31.400 回答
2

这是用于指数退避的代码:

boolean thisIsARetry = false;
boolean keepRetrying = true;
int delayTime = 2;
int maxDelayTime = 4;

while(keepRetrying && delayTime <= maxDelayTime) {
    if(thisIsARetry) {
        //sleep for delayTime seconds
        try {
            Thread.sleep(1000 * delayTime);
            delayTime *= 2;
        } catch (Exception e) {
            //print exception
            delayTime *= 2;
            continue;
        }
    } else {
        thisIsARetry = true;
    }

    //the actual network request or some other operation here
    if(ACTUAL_OPERATION_SUCCESS) {
        keepRetrying = false;
    }
}
于 2016-01-20T09:48:42.117 回答
0

AFAIK Google 制造的指数退避仅在驱动 Java API 中下载或上传内容时使用。对于其他请求,您需要自己的实现。

我为任何请求实现它所做的是包装一个 Callable 执行一次请求并让包装类执行异常处理和重复请求。

于 2012-10-10T21:29:25.380 回答