如何在Java中为BigQuery API请求设置超时

时间:2014-08-19 14:25:12

标签: java google-app-engine google-bigquery

有时,当我们轮询BigQuery作业时,我们的请求最终会以SocketTimeoutException结束。您可以在下面看到引发异常的代码。

this.bigquery.jobs().get(projectNumber, jobId).execute();

以下是我们收到的错误消息。

...
Caused by: java.net.SocketTimeoutException:
Timeout while fetching URL: https://www.googleapis.com/bigquery/v2/projects/######/jobs/######
...

我的问题是,是否有办法延长超时。有谁知道默认超时是什么?

2 个答案:

答案 0 :(得分:7)

您可以将凭据对象包装在禁用(或扩展)超时的HTTP初始化程序中。也就是说,你现在有这个:

Credential credential = ...
Bigquery bigquery = new Bigquery(HTTP_TRANSPORT, JSON_FACTORY, credential);

你可以做到

final Credential credential = ...
HttpRequestInitializer initializer = new HttpRequestInitializer() {
  public void initialize(HttpRequest request) {
    credential.initialize(request);
    request.connectTimeout = request.readTimeout = 0;
  }
}
Bigquery bigquery = new Bigquery(HTTP_TRANSPORT, JSON_FACTORY, initializer);

有关BigQuery对象javadoc的信息,请参阅this,有关BigQuery对象创建示例,请参阅this,有关HttpRequestInitializer重载,请参阅this

答案 1 :(得分:1)

如果只是请求,您只想在请求正文中设置超时:

query_config = { 'timeoutMs': 1000,

将timeoutsMs设置为你喜欢的任何理由;)

希望有助于文档 here

修改

要获得查询结果,即使它没有遵守从站点获取的超时调用jobs.getQueryResults,您也必须指定一个起始行,这也需要一个与行为相同的超时。 jobs.query超时允许等待作业尚未完成。