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

Mik*_*ass 3 android amazon-s3 amazon-web-services

我的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的错误保真度.

小智 5

这两种方法可以帮助你:

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

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

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

给出这两种方法并拍摄,让我们知道这是否有帮助!