gpt4 book ai didi

Java 库 AmazonS3Client.getObject 从不返回

转载 作者:行者123 更新时间:2023-11-30 08:59:52 26 4
gpt4 key购买 nike

我遇到了一个问题,似乎对 AmazonS3Client.getObject 的调用永远不会返回;这每天都发生在我们身上,我相信这是 S3 运行时的日常到期工作。

似乎没有办法为此请求指定超时值,这会导致我们的线程池无限期阻塞,导致我们的整个实例在足够多的实例无限期挂起时无响应。

有办法克服吗?我已经沿着 Thread.interrupt 路径走下去,但我不确定它是否会遵守该信号。

这是卡住的堆栈跟踪:

"image-s3-dispatcher-10187" - Thread t@10481
java.lang.Thread.State: TIMED_WAITING
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <7945c7e6> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.parkUntil(LockSupport.java:267)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitUntil(AbstractQueuedSynchronizer.java:2130)
at org.apache.http.pool.PoolEntryFuture.await(PoolEntryFuture.java:129)
at org.apache.http.pool.AbstractConnPool.getPoolEntryBlocking(AbstractConnPool.java:281)
at org.apache.http.pool.AbstractConnPool.access$000(AbstractConnPool.java:62)
at org.apache.http.pool.AbstractConnPool$2.getPoolEntry(AbstractConnPool.java:176)
at org.apache.http.pool.AbstractConnPool$2.getPoolEntry(AbstractConnPool.java:172)
at org.apache.http.pool.PoolEntryFuture.get(PoolEntryFuture.java:100)
at org.apache.http.impl.conn.PoolingClientConnectionManager.leaseConnection(PoolingClientConnectionManager.java:212)
at org.apache.http.impl.conn.PoolingClientConnectionManager$1.getConnection(PoolingClientConnectionManager.java:199)
at sun.reflect.GeneratedMethodAccessor22.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.amazonaws.http.conn.ClientConnectionRequestFactory$Handler.invoke(ClientConnectionRequestFactory.java:70)
at com.amazonaws.http.conn.$Proxy9.getConnection(Unknown Source)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:456)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)
at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:384)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:232)
at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3528)
at com.amazonaws.services.s3.AmazonS3Client.getObject(AmazonS3Client.java:1111)
at com.amazonaws.services.s3.AmazonS3Client.getObject(AmazonS3Client.java:984)
at com.spingo.s3client.S3Client$$anonfun$read$1.apply(S3Client.scala:110)

它卡住的所有 8 个待处理请求都是针对 <=10kb 的文件,一些请求长达 15 分钟。

最佳答案

完成以下操作后:

  • 升级到最新的 aws-java-sdk (1.9.7)(从 1.9.6 开始)
  • 显式关闭 S3Object#getObjectContent 返回的流
  • 禁用亚马逊的过期规则。

...问题在一周内第一次停止出现。很难说是哪些因素(如果有的话)导致了改善。

如果是因为没有明确关闭流,好吧,那一年我一直在使用 aws-java-sdk 几个月,没有任何问题。而且,奇怪的是,问题是如何在每天的确切时间出现在所有实例上的。

如果它在 Amazon 上禁用过期规则,那么,我会报告当我重新打开它们时发生的情况。

如果它正在升级最新的 aws-java-sdk,则在发行说明中没有提及已解决的观察到的无限 block 问题。

虽然我很想知道真正的问题是什么,但我还不够急切地尝试再次解决它。这是每天只能在特定时间复制的东西。 :/

--

更新

问题实际上并没有解决;它只是碰巧有一天没有发生。今天早上它再次发生,时间不同。

在 AWS 论坛上运气更好。似乎这一切都可以追溯到 apache http 库的问题。留下面包屑造福各位网友:

https://forums.aws.amazon.com/thread.jspa?messageID=585774&#585774

--

更新 2

更新 apache http 库没有帮助。也没有回滚 AWS 客户端。

我们正在检查一个对象是否存在的区域。为此,我们调用了 AmazonS3Client#getObject 并检查异常,认为 S3Object#getObjectContent 是实际获取流的东西。阅读文档让我相信这一点。但是,在阅读源代码时,我开始意识到 getObjectContent 是一个简单的 getter 并且库会预先分配流。因为我们没有意识到这个事实,所以如果我们不调用 S3Object#getObjectContent,我们就不会在流上调用 close。

因此,故事的寓意是:任何时候调用 AmazonS3Client#getObject 时,关闭流。

关于Java 库 AmazonS3Client.getObject 从不返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27052190/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com