Google cloud storage 来自S3的云存储传输服务卡在";“此传输正在开始”;
我们应用程序的一部分通过存储传输服务API启动从Amazon S3到Google云存储的传输。我们已经成功安装并运行了几个月,直到昨天我们的传输停止工作。我们可以在控制台中看到传输已启动,但它无限期挂起,只有一个历史记录项声明:“此传输正在启动…”我们有一个后台进程轮询传输状态,我们看到该状态返回“transfer_calculating” 在尝试调试此问题时,我们通过设置了一个传输。我们使用了应用程序使用的相同AWS访问密钥id/机密访问密钥,传输成功完成。这使我们相信问题与传输服务API或启动API调用的代码无关 调动职务代码:Google cloud storage 来自S3的云存储传输服务卡在";“此传输正在开始”;,google-cloud-storage,google-cloud-data-transfer,Google Cloud Storage,Google Cloud Data Transfer,我们应用程序的一部分通过存储传输服务API启动从Amazon S3到Google云存储的传输。我们已经成功安装并运行了几个月,直到昨天我们的传输停止工作。我们可以在控制台中看到传输已启动,但它无限期挂起,只有一个历史记录项声明:“此传输正在启动…”我们有一个后台进程轮询传输状态,我们看到该状态返回“transfer_calculating” 在尝试调试此问题时,我们通过设置了一个传输。我们使用了应用程序使用的相同AWS访问密钥id/机密访问密钥,传输成功完成。这使我们相信问题与传输服务API或启
TransferJob tjob = new TransferJob()
.setDescription(description)
.setStatus('ENABLED')
.setProjectId(transferGoogleProject)
.setTransferSpec(
new TransferSpec()
.setGcsDataSink(new GcsData().setBucketName(googleStorageBucket))
.setAwsS3DataSource(
new AwsS3Data()
.setBucketName(s3Bucket)
.setAwsAccessKey(new AwsAccessKey().setAccessKeyId(transferAwsKey).setSecretAccessKey(transferAwsSecret)))
.setObjectConditions(new ObjectConditions().setIncludePrefixes(s3Keys))
.setTransferOptions(
new TransferOptions()
.setDeleteObjectsFromSourceAfterTransfer(false)
.setOverwriteObjectsAlreadyExistingInSink(true)
.setDeleteObjectsUniqueInSink(false)))
.setSchedule(
new Schedule()
.setScheduleStartDate(date)
.setScheduleEndDate(date)
.setStartTimeOfDay(time))
tjob = storagetransfer.transferJobs().create(tjob).execute()
库配置:
<dependency>
<groupId>com.google.api-client</groupId>
<artifactId>google-api-client</artifactId>
<version>1.19.1</version>
</dependency>
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-bigquery</artifactId>
<version>v2-rev191-1.19.1</version>
</dependency>
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-storage</artifactId>
<version>v1-rev26-1.19.1</version>
</dependency>
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-storagetransfer</artifactId>
<version>v1-rev3-1.19.1</version>
</dependency>
<dependency>
<groupId>com.google.oauth-client</groupId>
<artifactId>google-oauth-client</artifactId>
<version>1.19.0</version>
</dependency>
<dependency>
<groupId>com.google.http-client</groupId>
<artifactId>google-http-client</artifactId>
<version>1.19.0</version>
</dependency>
<dependency>
<groupId>com.google.http-client</groupId>
<artifactId>google-http-client-jackson2</artifactId>
<version>1.19.0</version>
</dependency>
com.google.api-client
谷歌api客户端
1.19.1
com.google.api
谷歌api服务bigquery
v2-rev191-1.19.1
com.google.api
谷歌api服务存储
v1-rev26-1.19.1
com.google.api
google api服务storagetransfer
v1-rev3-1.19.1
com.google.oauth-client
谷歌oauth客户端
1.19.0
com.google.http-client
谷歌http客户端
1.19.0
com.google.http-client
google-http-client-jackson2
1.19.0
在我们的开发环境中,我们已经升级了1.21.0版本,但是传输仍然停留在“此传输正在开始…”的状态
在这一点上,我们陷入了困境,还有其他人遇到了这个问题吗?我也遇到了这个问题。通过Google存储网页传输提交内容是可行的,但通过api传输提交内容已经完全停止
我甚至尝试使用Google Storage Oauth网页尝试提交,但同样失败。根据@mayur deshpande在Google提供的反馈(谢谢!),我们的问题源于传递给setStartTimeOfDay()的时间值需要使用UTC。到目前为止,我们已经使用了US/Pacific,这在以下来自 由于时差的原因,我们发送请求的时间已经过去,因此传输一直处于启动状态,直到第二天我们的时间到达。当请求最终完成时,我们看到了这种情况 今天的javadoc for setStartTime()确实指出了使用UTC的必要性:
/**
* The time in UTC at which the transfer will be scheduled to start in a day. Transfers may start
* later than this time. If not specified, transfers are scheduled to start at midnight UTC.
* @param startTimeOfDay startTimeOfDay or {@code null} for none
*/
public Schedule setStartTimeOfDay(TimeOfDay startTimeOfDay)
上面引用的示例代码应该反映这一要求,因此我将在github repo中提交一个问题
此外,由于我们只进行一次传输,因此我们确保在将来将开始时间设置为一分钟,以考虑服务器之间细微的时间差异:
DateTime now = new DateTime().plusMinutes(1)
Date date = new Date().setDay(now.dayOfMonth).setMonth(now.monthOfYear).setYear(now.year)
TimeOfDay time = new TimeOfDay().setHours(now.hourOfDay).setMinutes(now.minuteOfHour).setSeconds(0)
请注意,在API中,StartTimeOfDay引用UTC(请参阅API引用:)。您通过电子邮件向我们发送的请求指定了过去基于UTC的一小时。请指定UTC格式的StartTimeOfDay。如果只想立即开始一次性作业运行,只需将StartTimeOfDay字段留空即可
还请注意,谷歌云用户界面允许客户在本地时区指定StartTimeOfDay,这与API不同 我发现存储传输服务很难开始工作。有许多细微差别。这将是非常有帮助的清理文件,并获得所有的信息在一个容易找到的地方在一个明确的方式 在我之后的任何人的概述: 1) 创建服务帐户 2) 通过IAM,为服务帐户提供角色Project->Editor 3) 从github.com/GoogleCloudPlatform/java-docs-samples/blob/master/storage/storage-transfer/src/main/java/com/google/cloud/storage/storagetransfer/samples上的示例代码开始/
- 3a)只需关注三个类:AwsRequester, TransferJobUtils&RetryHttpInitializerRapper 3b)创建Storagetransfer客户端,需要 google api服务storagetransfer jar,用于连接您的机密 JSON文件
- 3c)创建TransferJob对象以提交作业,这是您
设置至少需要设置的projectId和Schedule
日期和时间为空,以便立即提交,但您可以
需要创建一个时间表吗
3d)创建一个TransferSpec对象,该对象将包含大部分
配置选项。选项的映射不清楚。你
将需要使用JSON API文档,
并匹配JavaAPI中的名称。至少,您需要
填充:AWS存储桶和凭证、地面军事系统接收器等。。。样本 给你这个。但你也会想要设置 ObjectConditions.setIncludePrefixes与字符串列表相同 通过用户界面,您可以使用这种方式
HTH?我们对遇到的困难表示歉意,并正在调查此问题。请将您的项目ID和确切查询发送至:gs-team@google.com这样我们就可以调查你的案子了?谢谢-谢谢你的提示,我们没有意识到可以让StartTimeOfDay空着立即转会(这当然是我们想要的)。我们已经更新了代码并成功地测试了它。这很好,因为它还消除了创建/发送请求和传输服务接收请求之间的时间差。正如我在下面的回答中所指出的,我们根据《创建传输开发指南》中的示例代码使用了US/Pacific。
DateTime now = new DateTime().plusMinutes(1)
Date date = new Date().setDay(now.dayOfMonth).setMonth(now.monthOfYear).setYear(now.year)
TimeOfDay time = new TimeOfDay().setHours(now.hourOfDay).setMinutes(now.minuteOfHour).setSeconds(0)