调用OSS Java SDK夯住
调用OSS Java SDK夯住(hang),通过jstack -l <pid>查看堆栈,夯在如下的位置:
- "main" prio=6 tid=0x000000000291e000 nid=0xc40 waiting on condition [0x0000000002dae000]
- java.lang.Thread.State: WAITING (parking)
- at sun.misc.Unsafe.park(Native Method)
- - parking to wait for <0x00000007d85697f8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
- at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
- at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
- at org.apache.http.pool.PoolEntryFuture.await(PoolEntryFuture.java:138)
- at org.apache.http.pool.AbstractConnPool.getPoolEntryBlocking(AbstractConnPool.java:306)
- at org.apache.http.pool.AbstractConnPool.access$000(AbstractConnPool.java:64)
- at org.apache.http.pool.AbstractConnPool$2.getPoolEntry(AbstractConnPool.java:192)
- at org.apache.http.pool.AbstractConnPool$2.getPoolEntry(AbstractConnPool.java:185)
- at org.apache.http.pool.PoolEntryFuture.get(PoolEntryFuture.java:107)
- at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.leaseConnection(PoolingHttpClientConnectionManager.java:276)
- at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$1.get(PoolingHttpClientConnectionManager.java:263)
- at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:190)
- at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
- at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
- at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
- at org.apache.http.impl.client.CloseableHtt pClient.execute(CloseableHtt pClient.java:82)
- at com.aliyun.oss.common.comm.DefaultServiceClient.sendRequestCore(DefaultServiceClient.java:113)
- at com.aliyun.oss.common.comm.ServiceClient.sendRequestImpl(ServiceClient.java:123)
- at com.aliyun.oss.common.comm.ServiceClient.sendRequest(ServiceClient.java:68)
- at com.aliyun.oss.internal.OSSOperation.send(OSSOperation.java:94)
- at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:146)
- at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:113)
- at com.aliyun.oss.internal.OSSObjectOperation.getObject(OSSObjectOperation.java:229)
- at com.aliyun.oss.OSSClient.getObject(OSSClient.java:629)
- at com.aliyun.oss.OSSClient.getObject(OSSClient.java:617)
- at samples.HelloOSS.main(HelloOSS.java:49)
原因: 连接池中连接泄漏,可能是使用OSSClient.getObject,但是没有关闭。请检查您的程序,确保没有连接泄漏。关闭方法如下:
- // 读取Object
- OSSObject ossObject = ossClient.getObject(bucketName, key);
- // 使用ObjectContent和ObjectMetadata
- // ...
- // 使用完毕后,一定要close
- ossObject.getObjectContent().close();
OSS Java SDK应用夯住问题排除的详细步骤,请参看
夯住(Hang)问题排查 。
ConnectionClosedException: Premature end of Content-Length delimited message body …
如果您在使用OSSClient.getObject时,报如下或类似错误:
- Exception in thread "main" org.apache.http.ConnectionClosedException: Premature end of Content-Length delimited message body (expected: 11990526; received: 202880
- at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:180)
- at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:200)
- at org.apache.http.impl.io.ContentLengthInputStream.close(ContentLengthInputStream.java:103)
- at org.apache.http.impl.execchain.ResponseEntityProxy.streamClosed(ResponseEntityProxy.java:128)
- at org.apache.http.conn.EofSensorInputStream.checkClose(EofSensorInputStream.java:228)
- at org.apache.http.conn.EofSensorInputStream.close(EofSensorInputStream.java:174)
- at java.io.FilterInputStream.close(FilterInputStream.java:181)
- at java.io.FilterInputStream.close(FilterInputStream.java:181)
- at com.aliyun.oss.event.ProgressInputStream.close(ProgressInputStream.java:147)
- at java.io.FilterInputStream.close(FilterInputStream.java:181)
- at samples.HelloOSS.main(HelloOSS.java:39)
原因:两次读取数据间隔时间超过1分钟。OSS会关闭超过1分钟没有发送/接收数据的连接。如果您的应用模式是,读取部分数据——处理数据——读取数据——处理数据,且处理数据的时间不固定。建议使用
指定范围读取,避免数据读取时连接关闭。