【问题标题】:How to set timeout for BigQuery API request in Java如何在 Java 中为 BigQuery API 请求设置超时
【发布时间】:2014-08-19 14:25:11
【问题描述】:

有时,当我们轮询 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/######
...

我的问题是是否有办法延长超时时间。有谁知道默认超时是多少?

【问题讨论】:

  • 这是直接在代码中完成还是作为任务队列完成?请注意,即使您使用超时,您仍然需要将自己限制在 1 分钟的访问 url 限制或 10 分钟的任务队列限制
  • 如果我超过了前端实例的最后期限,我会得到DeadlineExceededException。这肯定与 BigQuery API 调用有关。
  • 哦,我知道套接字和截止时间超时之间的区别。我只是说要小心增加你的截止日期,以免遇到其他错误^^

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


【解决方案1】:

您可以将凭证对象包装在禁用(或扩展)超时的 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);

请参阅this 了解 BigQuery 对象 javadoc,this 了解 BigQuery 对象创建示例,this 了解 HttpRequestInitializer 重载。

【讨论】:

  • 我怎样才能将这样的连接与 BigQuery API 客户端一起使用?实际上,如果请求失败,我会重试请求,但是,我还是想延长超时时间。
  • 嗯...我原以为这种方法是静态的。我已经更新了我的答案,希望能奏效。如果没有,请告诉我,我会 ping 内部 google api 人员。
  • 嘿@JordanTigani,这仍然是缓解超时的首选方法吗?最近经常打他们(来自与 BQ 相同项目中的 App Engine 实例)
【解决方案2】:

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

query_config = { 'timeoutMs': 1000,

将 timeoutsMs 设置为您喜欢的任何值 ;)

希望对文档有所帮助的是 here

编辑

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

【讨论】:

  • 这仅与查询作业有关。我需要为任何 BigQuery API 请求设置超时。
  • 它只解决查询请求。我担心与检索任何 BigQuery 作业(查询、加载、提取、链接)的 API 调用相关的超时。
猜你喜欢
  • 2022-12-11
  • 2020-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多