【发布时间】:2013-10-16 08:14:46
【问题描述】:
我正在使用 Google 计算实例上的 Google Cloud SQL 驱动程序在长时间运行的批处理过程中将结果保存到 Google Cloud SQL 数据库。
在某个时候,可能在运行的第一个小时之后,oAuth 令牌似乎过期了,并且所有后续请求都失败了:
Caused by: java.sql.SQLException: 400 Bad Request
{
"error" : "unauthorized_client"
}
at com.google.cloud.sql.jdbc.internal.googleapi.RpcGoogleApi.newOpenConnectionIOException(RpcGoogleApi.java:168)
at com.google.cloud.sql.jdbc.internal.googleapi.RpcGoogleApi.openConnection(RpcGoogleApi.java:104)
at com.google.cloud.sql.jdbc.internal.SqlProtoClient.openConnection(SqlProtoClient.java:58)
at com.google.cloud.sql.jdbc.Driver.connect(Driver.java:66)
at com.google.cloud.sql.Driver.connectImpl(Driver.java:109)
at com.google.cloud.sql.Driver.connect(Driver.java:98)
at com.google.cloud.sql.Driver.connect(Driver.java:31)
我可以中止该过程,从客户端行运行 google_sql.sh 并重新启动批处理,并且连接会正常,直到令牌再次过期。
显然,命令行工具正在做一些事情来在连接之前刷新令牌;我如何为我的批处理做同样的事情?
【问题讨论】:
-
什么是 google_sql.sh?
-
@pinoyyid google_sql.sh 是 google cloud sdk 中提供的命令行实用程序,它启动 com.google.cloud.sql.tool.googleapi.SqlTool。这显然可以刷新身份验证令牌,但没有记录。
-
知道了。我会做一些挖掘工作
-
如果我找到源代码,我会好好看看。同时,根据您的问题,我将其称为 SDK 中的一个错误,即它没有刷新访问令牌,正如您所说,该令牌在整点到期。您可以尝试一种解决方法。该错误可能仅存在于命令行模式下(基于他们不希望单个命令持续超过一小时)。可能是在交互模式下,它们具有基于交互会话可以长期存在的刷新逻辑。所以尝试在交互模式下运行并输入你的命令。
标签: google-api google-oauth google-api-java-client google-cloud-sql