java - 使用 SpreadSheet API 时无法完成 HTTP 请求

标签 java google-app-engine google-sheets-api

我正在开发一个 Google App Engine 应用程序,它可以读取和编辑一个包含大约 150 列和 500 行的大型电子表格。除了具体大小(可能会有所不同)之外,我正在寻找一种提高性能的方法,因为大多数时候我都会收到 500 内部服务器错误(如下所示)。

java.lang.RuntimeException: Unable to complete the HTTP request Caused by: java.net.SocketTimeoutException: Timeout while fetching URL: https://spreadsheets.google.com/feeds/worksheets/xxxxxxxxxxxxxxxxxxxxxxx/private/full

在下面的代码片段中,您可以看到我如何读取电子表格以及哪一行抛出异常。

for (SpreadsheetEntry entry : spreadsheets) {
    if (entry.getTitle().getPlainText().compareTo(spreadsheetname) == 0) {
        spreadsheet = entry;
    }
}

WorksheetFeed worksheetFeed = service.getFeed(spreadsheet.getWorksheetFeedUrl(), WorksheetFeed.class);
List<WorksheetEntry> worksheets = worksheetFeed.getEntries();
WorksheetEntry worksheet = worksheets.get(0);

URL listFeedUrl = worksheet.getListFeedUrl();
// The following line is the one who generates the error
ListFeed listFeed = service.getFeed(listFeedUrl, ListFeed.class);

for (ListEntry row : listFeed.getEntries()) {
    String content = row.getCustomElements().getValue("rowname");
    String content2 = row.getCustomElements().getValue("rowname2");
}

我已经使用结构化查询提高了性能。基本上,我在 URL 中应用过滤器,这样我就可以只检索我需要的几行。请注意,无论如何,有时我仍然会收到上述错误。

URL listFeedUrl = new URI(worksheet.getListFeedUrl().toString() + "?sq=rowname=" + URLEncoder.encode("\"" + filter+ "\"").toString()).toURL();

但是我的问题有所不同,首先,在某些时候我必须读取所有行,但只能读取少数列(大约 5 列)。我仍然需要找到一种方法来实现这一点,我确实知道还有另一个参数“tq”,它允许选择列,但该语句需要字母符号(例如 A、B、AA),我想使用改为列名称。

最重要的是我需要摆脱 500 内部服务器错误。由于这听起来像是超时问题,我想将该值增加到合理的时间量。我的用户也可以等待几秒钟,因为它看起来完全是随机的。当它工作时,它会在大约 2-3 秒内加载页面。然而,当它不起作用时,我会收到 500 内部服务器错误,这对于最终用户来说确实令人沮丧。

有什么想法吗?我在 App Engine 设置中找不到任何内容。到目前为止,我唯一的想法是将电子表格拆分为多个电子表格(或工作表),以便读取更少的列。但是,如果有一个选项可以让我增加超时,那就太棒了。

编辑:我在互联网上四处寻找,我可能找到了一些可以帮助我的东西。我刚刚发现服务对象提供了 setConnectionTimeout 方法,立即对其进行测试。

// Set timeout

int timeout = 60000;
service.setConnectTimeout(timeout);

最佳答案

超时

我使用 10 秒超时重试。对我来说效果很好。

纸张尺寸

我一次使用过 80,000 个单元。效果很好,我还没有看到重试失败。我使用的是 CellFeed,而不是 ListFeed。

是的,它不喜欢大片,1000 个单元左右的小片要快得多。即使我只写入工作表的一部分,小工作表也会快得多。 (感觉像是重新计算整张纸,因为看起来并不取决于数据量,但我不确定)

指数退避

Zig 建议指数退避 - 对数字感兴趣 - 人们通过指数退避获得的超时值和失败率 - 以及工作表大小的影响。

我怀疑从 3 秒超时开始,每次重试加倍可能会起作用,但尚未测试过。

关于java - 使用 SpreadSheet API 时无法完成 HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22099780/

相关文章:

java - 使用 fop 2.3 版本时找不到 FOP 图像

java - 如何对由 "null"和字符串组合的数组进行排序?

google-app-engine - 如何为 404 错误添加自定义错误页面(找不到页面)

linux - 无法从 LAN 访问 App Engine 应用程序

google-chrome - 使用 Google API 的 Chrome 扩展中的 PUT 请求未呈现

google-apps-script - 谷歌表格, "The request is missing a valid API key"

java - 通过 SSH 将 Jconsole 连接到远程 JVM

java - @Value 在 junit 5 中为 null

google-app-engine - 如何在 Golang 中使用 http.FileServer 处理 GAE 上的 404 错误

javascript - 请求缺少有效的 API key - Google 表格