开发者社区> 问答> 正文

Java-SDK的常见问题(三)


调用OSS Java SDK夯住


调用OSS Java SDK夯住(hang),通过jstack -l <pid>查看堆栈,夯在如下的位置:

  1. "main" prio=6 tid=0x000000000291e000 nid=0xc40 waiting on condition [0x0000000002dae000]
  2. java.lang.Thread.State: WAITING (parking)
  3.     at sun.misc.Unsafe.park(Native Method)
  4.     - parking to wait for  <0x00000007d85697f8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
  5.     at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
  6.     at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
  7.     at org.apache.http.pool.PoolEntryFuture.await(PoolEntryFuture.java:138)
  8.     at org.apache.http.pool.AbstractConnPool.getPoolEntryBlocking(AbstractConnPool.java:306)
  9.     at org.apache.http.pool.AbstractConnPool.access$000(AbstractConnPool.java:64)
  10.     at org.apache.http.pool.AbstractConnPool$2.getPoolEntry(AbstractConnPool.java:192)
  11.     at org.apache.http.pool.AbstractConnPool$2.getPoolEntry(AbstractConnPool.java:185)
  12.     at org.apache.http.pool.PoolEntryFuture.get(PoolEntryFuture.java:107)
  13.     at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.leaseConnection(PoolingHttpClientConnectionManager.java:276)
  14.     at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$1.get(PoolingHttpClientConnectionManager.java:263)
  15.     at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:190)
  16.     at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
  17.     at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
  18.     at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
  19.     at org.apache.http.impl.client.CloseableHtt pClient.execute(CloseableHtt pClient.java:82)
  20.     at com.aliyun.oss.common.comm.DefaultServiceClient.sendRequestCore(DefaultServiceClient.java:113)
  21.     at com.aliyun.oss.common.comm.ServiceClient.sendRequestImpl(ServiceClient.java:123)
  22.     at com.aliyun.oss.common.comm.ServiceClient.sendRequest(ServiceClient.java:68)
  23.     at com.aliyun.oss.internal.OSSOperation.send(OSSOperation.java:94)
  24.     at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:146)
  25.     at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:113)
  26.     at com.aliyun.oss.internal.OSSObjectOperation.getObject(OSSObjectOperation.java:229)
  27.     at com.aliyun.oss.OSSClient.getObject(OSSClient.java:629)
  28.     at com.aliyun.oss.OSSClient.getObject(OSSClient.java:617)
  29.     at samples.HelloOSS.main(HelloOSS.java:49)

原因: 连接池中连接泄漏,可能是使用OSSClient.getObject,但是没有关闭。请检查您的程序,确保没有连接泄漏。关闭方法如下:
  1. // 读取Object
  2. OSSObject ossObject = ossClient.getObject(bucketName, key);
  3. // 使用ObjectContent和ObjectMetadata
  4. // ...
  5. // 使用完毕后,一定要close
  6. ossObject.getObjectContent().close();

OSS Java SDK应用夯住问题排除的详细步骤,请参看 夯住(Hang)问题排查

ConnectionClosedException: Premature end of Content-Length delimited message body …


如果您在使用OSSClient.getObject时,报如下或类似错误:
  1. Exception in thread "main" org.apache.http.ConnectionClosedException: Premature end of Content-Length delimited message body (expected: 11990526; received: 202880
  2.     at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:180)
  3.     at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:200)
  4.     at org.apache.http.impl.io.ContentLengthInputStream.close(ContentLengthInputStream.java:103)
  5.     at org.apache.http.impl.execchain.ResponseEntityProxy.streamClosed(ResponseEntityProxy.java:128)
  6.     at org.apache.http.conn.EofSensorInputStream.checkClose(EofSensorInputStream.java:228)
  7.     at org.apache.http.conn.EofSensorInputStream.close(EofSensorInputStream.java:174)
  8.     at java.io.FilterInputStream.close(FilterInputStream.java:181)
  9.     at java.io.FilterInputStream.close(FilterInputStream.java:181)
  10.     at com.aliyun.oss.event.ProgressInputStream.close(ProgressInputStream.java:147)
  11.     at java.io.FilterInputStream.close(FilterInputStream.java:181)
  12.     at samples.HelloOSS.main(HelloOSS.java:39)

原因:两次读取数据间隔时间超过1分钟。OSS会关闭超过1分钟没有发送/接收数据的连接。如果您的应用模式是,读取部分数据——处理数据——读取数据——处理数据,且处理数据的时间不固定。建议使用 指定范围读取,避免数据读取时连接关闭。





展开
收起
青衫无名 2017-10-18 11:24:04 3999 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
跨平台的云服务SDK需要什么 立即下载
如何通过 Serverless 提高 Java 微服务治理效 立即下载
一个跨平台的云服务SDK需要什么 立即下载