当前位置: 首页 > 知识库问答 >
问题:

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

谢阳成
2023-03-14

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

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

http://aws.amazon.com/articles/1109?_encoding=UTF8

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

HTTP状态代码:403禁止

错误代码:Request TimeToo偏斜

描述:请求时间和服务器时间相差太大。

然而,当使用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和AmazonS3客户端之间的确切权衡。据我所知,无法通过(同步)AmazonS3Client获取进度信息。putObjectRequest对我来说是个拦截器

更新#2:我衷心感谢Jason(AWS开发工具包团队)在这里停下来帮助我。事实上,如果您使用某些方法,则重要信息可作为 AmazonS3Exception 上的属性提供。这些文档最初让我感到困惑,我认为需要一个手动的Thread.sleep()循环来轮询状态(因此我无法利用等待完成或等待例外),但是如果您在PutObjectRequest上使用进度查看器,则可以获得完整的进度回调和AmazonS3Exception的错误保真度。

共有2个答案

申博厚
2023-03-14

嗯,我已经调试了Amazon的SDK,很抱歉,这些信息正在被内部吞没。也许我会尝试提交一个补丁。

详细信息:AmazonS3Exception 正在内部抛出,它实际上确实准确地报告了这个确切的错误场景,但是一个非常广泛的尝试捕获(异常 e )消耗了它并冲走了特异性。

这是一个罪恶的尝试:

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

这是一个屏幕截图,显示使用正确的信息正确抛出了Amazon S3Exception…

许安邦
2023-03-14

这两种方法应该可以帮助您:

  • Transfer.waitForCompletion()
  • Transfer.waitForException()

如果您基于传输进度事件检测到传输失败,您可以简单地调用Transfer.waitForException()以返回发生的异常。在这种情况下,该异常将是Amazon ServiceException,其中包含您需要查看的所有信息,即真正的问题是时钟偏移问题。

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

我不同意“捕获异常”块“非常广泛”。该代码的要点是捕获发生的任何错误,将传输标记为失败并重新引发错误,以便应用程序代码可以知道它。如果它不那么宽泛,那么这正是例外情况,例外情况可能会偷偷溜走,传输进度将无法正确更新,并且与现实不同步。

给出这两个方法和镜头,让我们知道是否有帮助!

 类似资料:
  • 我能够从照片中捕捉颜色的RGB值,但我希望能够通过编程检测该颜色是红色、橙色、黄色、绿色、蓝色、紫色、棕褐色还是白色或黑色。 所以我需要指定返回的RGB范围,例如,红色的值。。。或者蓝色。。。等等我现在有类似的东西,但它不包括所有可能的RGB品种。 红色 R=255,克 R=255,G=0,B 橙色 R=255,克 R=240,G=255,B=0 等等 有人知道如何获取任何RGB值,并检测它是红色

  • 问题内容: 我通过PuTTY和WinSCP连接到我大学的小型Linux集群,使用后者传输文件,并使用前者进行编译和运行。到目前为止,我的工作是在大学的实验室中进行的,但是今天我一直在家里进行一些工作,从而产生了有趣的警告。 我上载了整个文件夹,在运行命令后,将其作为输出的最后一行: make:警告:检测到时钟偏斜。您的构建可能不完整。 生成的二进制文件正确运行,并且在构建过程中似乎没有任何其他意外

  • 问题内容: 我将C#与SMO一起使用,并尝试检测要连接到的SQL Server版本(例如,企业版,标准版)。我知道如何获取版本信息,但这只能告诉我SQL Server的版本(例如,SQL Server 2008与SQL Server 2005)。 有谁知道如何获得实际的产品版本(例如,企业版,标准版)? 我需要此信息,因为某些SQL Server功能只是企业级的。因此,我可以尝试调用它们并捕获异常

  • 问题内容: Linux提供了stime(2)调用来设置系统时间。但是,虽然这将更新系统时间,但不会将BIOS硬件时钟设置为与新系统时间匹配。 Linux系统通常会在关机时并定期将硬件时钟与系统时间同步。但是,如果在这些自动同步之一之前重启机器,则重新启动机器的时间将不正确。 设置系统时间时,如何确保更新硬件时钟? 问题答案: 查看rtc手册页以获取详细信息,但是如果您以root用户身份登录,则如下

  • 我的Android应用程序有一个带有PagerSnapHelper的RecyclizerView。每个项目的宽度和高度与。因此,页面上仅保留 1 个视图项。我有兴趣知道特定视图项何时对用户完全可见。我想对该视图执行一些操作。 我正在使用MpAndroidChart库在每个视图项目中显示图表。我也在为这些图表制作动画。但是,由于 RecyclerView 加载了一些与当前可见视图项相邻的视图项,因此

  • 我需要帮助来了解时钟偏差的工作原理。我们定义时钟偏差来处理双方之间的时间变化。但是,我的困惑是: 我们在令牌本身中有所有信息,如令牌创建时间和过期时间 可以验证令牌 令牌在服务器上创建 那么,为什么我们需要时钟偏差呢?谁能给我一个例子,说明它是如何工作的,以及在哪些情况下它会导致问题或好处?