AWS S3 Java SDK:以编程方式检测时间/时钟偏差?

时间:2013-02-22 20:58:51

标签: android amazon-web-services amazon-s3

我的Android应用使用AWS Java SDK将用户照片上传到S3。

每当用户的手机时钟出现“歪斜”时,都会导致所有转接失败。这是S3的一个有据可查的方面:

http://aws.amazon.com/articles/1109?_encoding=UTF8&jiveRedirect=1#04

上游S3服务似乎非常清楚地报告了这个错误:

  

HTTP状态代码:403禁止

     

错误代码:RequestTimeToo-Skewed

     

描述:请求时间和服务器之间的差异   时间太长了。

然而,当使用Java SDK时,似乎信息性的403代码丢失了...而且我只有一个不透明的" TransferState.Failed"过去(如果互联网连接丢失,如果它超时等,则偶然会出现同样的错误......)。

据我所知,从文档中可以看出:

http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/index.html http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/transfer/TransferProgress.html http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/transfer/Transfer.TransferState.html http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/transfer/Upload.html

没有办法获得额外的" RequestTimeToo-Skewed"有关转移失败的元数据。

我错过了吗?当使用亚马逊的Java SDK进行S3传输失败时,有没有办法获得其他错误信息?

更新#1: 一位意见提供者强调我应该澄清两点:

  • 我实际上正在使用适用于Android的AWS SDK(它看起来与Java SDK非常相似,但仍然不同)
  • 我使用TransferManager类来执行上传。显然,这是一个包含较低级别AmazonS3Client的高级类......而这个较低级别的类应该公开我需要的错误报告,但我仍在调查TransferManager和AmazonS3Client之间所涉及的确切权衡。据我所知,没有办法通过(同步)AmazonS3Client.putObjectRequest获取进度信息,这对我来说是一个阻碍...

更新#2: 衷心感谢Jason(AWS SDK团队)在这里停下来帮助我。实际上,如果使用某些方法,重要信息可作为AmazonS3Exception的属性使用。文档最初让我困惑,我认为需要一个手动Thread.sleep()循环来轮询状态(因此我无法利用waitForCompletion或waitForException),但是如果你在PutObjectRequest上使用ProgressListener,你可以获得完整的进度回调和AmazonS3Exception的错误保真度。

2 个答案:

答案 0 :(得分:5)

这两种方法可以帮助你:

如果根据传输进度事件检测到传输失败,则只需调用Transfer.waitForException()即可返回发生的异常。在这种情况下,该异常将是一个AmazonServiceException,其中包含您需要查看真正问题是时钟偏差问题所需的所有信息。

或者,Transfer.waitForCompletion()方法将从ExecutionException中解包原始异常并直接抛出原始异常,就像它在一个线程上发生的一样。如果您想使用catch块来干净而优雅地捕获不同类型的错误,这可能是一种更方便的方法。

我不同意“捕获异常”块是“残酷的广泛”。该代码的要点是捕获发生的任何错误,将传输标记为失败并重新抛出错误,以便应用程序代码可以了解它。如果它不那么宽泛,那么就是正是异常可能会潜入并且传输进度无法正确更新并且与现实不同步的情况。

给出这两种方法并拍摄,如果有帮助,请告诉我们!

答案 1 :(得分:1)

好吧,我已经调试了亚马逊的SDK,我很遗憾地说这些信息被内部吞没了。也许我会尝试提交补丁。

详细信息:内部抛出了一个AmazonS3Exception,实际上确实报告了这个确切的错误情况,但是一个残酷的尝试捕获(Exception e)消耗它并且消除了特异性。

这是有罪的尝试:

https://github.com/aws/aws-sdk-java/blob/master/src/main/java/com/amazonaws/services/s3/transfer/internal/UploadMonitor.java#L145

这是一个屏幕截图,显示使用正确的信息正确抛出AmazonS3Exception ...

debug screenshot