其他高频问题汇总(Java SDK)
开发过程中,您有任何问题可以在github上提交issue。
SignatureDoesNotMatch签名不匹配
1 2 |
HTTP Code: 403 Error Code: SignatureDoesNotMatch |
此类错误一般有三种原因:
- 初始化ObsClient时传入的SK有误,解决方法:检查SK,确保正确;
- 旧版本OBS Java SDK的BUG,解决方法:升级SDK到最新版本;
- OBS Java SDK 2.1.x版本与其依赖库Apache HttpClient的兼容性问题,解决方法:使用固定版本的依赖库,httpcore-4.4.4和httpclient-4.5.3。
MethodNotAllowed方法不允许
1 2 |
HTTP Code: 405 Error Code: MethodNotAllowed |
此错误一般是请求的OBS服务端未上线ObsClient接口依赖的特性,请联系OBS运维团队进行进一步确认。
BucketAlreadyOwnedByYou创桶失败
1 2 |
HTTP Code: 409 Error Code: BucketAlreadyOwnedByYou |
OBS中的桶要求全局唯一,即使在不同区域,也不允许出现同名桶。解决方法:如果调用ObsClient.createBucket接口出现该异常,请确认该桶是否已存在。您可通过如下两种方式判断该桶是否已存在。
方式一(推荐):调用ObsClient.listBuckets接口查询您拥有的全部桶列表后判断该桶是否已经存在;
方式二:调用ObsClient.headBucket接口判断该桶是否已经存在。
ObsClient.headBucket接口只能访问到当前区域下的桶,而ObsClient.listBuckets接口能访问到所有区域下的桶。
BucketAlreadyExists创桶失败
1 2 |
HTTP Code: 409 Error Code: BucketAlreadyExists |
OBS中的桶要求全局唯一,即使在不同区域,也不允许出现同名桶。解决方法:如果调用ObsClient.createBucket接口出现该异常,表明其他用户已创建了该桶,请换一个桶名后重新创建。
连接超时
1 2 3 4 |
HTTP Code: 408 Caused by: java.net.ConnectException: Connection timed out: connect at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85) |
此类错误一般有三种原因:
- 初始化ObsClient时传入的Endpoint有误,解决方法:检查Endpoint,确保正确;
- 客户端到OBS服务端的网络异常,导致无法访问,解决方法:检查客户端到OBS服务端的网络健康状况;
- DNS解析出的OBS服务域名无法访问,解决方法:联系OBS运维团队。
读写超时
1 2 3 4 5 6 |
HTTP Code: 408 Error Code:RequestTimeOut Caused by: java.net.SocketTimeoutException: timeout at okio.Okio$4.newTimeoutException(Okio.java:232) at okio.AsyncTimeout.exit(AsyncTimeout.java:285) at okio.AsyncTimeout$2.read(AsyncTimeout.java:241) |
此类错误一般有两种原因:
- 客户端到OBS服务端的网络时延过大,解决方法:检查客户端到OBS服务端的网络健康状况;
- 客户端到OBS服务端的网络异常,导致无法访问,解决方法:检查客户端到OBS服务端的网络健康状况。
异常返回值为-1
1
|
HTTP Code: -1 |
此类错误一般有三种原因:
- 使用了旧版的OBS Java SDK并且发生了连接超时或读写超时的异常,解决方法:参见连接超时和读写超时的解决方法;
- 旧版OBS Java SDK的BUG,解决方法:升级到最新版本的SDK,可以从这里下载最新版本;
- 服务端返回了异常的结果,导致SDK解析返回结果时出现了不可预期的错误,解决方法:尝试从日志中获取OBS服务端请求ID,并联系OBS运维团队。
ObsException中无法获取错误码
此类错误一般有两种原因:
- 调用ObsClient.getBucketMetadata或ObsClient.getObjectMetadata报错,此种场景下由于后台使用的是HEAD请求,服务端不会返回错误码,解决方法:使用ObsException.getResponseCode获取HTTP状态码,根据状态码分析可能原因,如403一般代表无权限访问,404一般代表桶或对象不存在;如无法定位原因,可从ObsException中获取OBS服务端请求ID后联系OBS运维团队;
- 初始化ObsClient时传入的Endpoint通过DNS解析后的IP不是有效的OBS服务端,解决方法:检查Endpoint配置是否正确,如Endpoint确认无误,联系OBS运维团队。
UnknownHostException域名无法解析异常
1 2 3 4 |
Caused by: java.net.UnknownHostException: bucketname.unknowndomain.com at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method) at java.net.InetAddress$1.lookupAllHostAddr(InetAddress.java:901) at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1293) |
此类错误一般有两种原因:
- 初始化ObsClient时传入的Endpoint有误,解决方法:检查Endpoint,确保正确;
- DNS无法解析OBS服务域名,解决方法:联系OBS运维团队。
NullPointException空指针异常
1 2 3 |
Exception in thread "main" java.lang.NullPointerException at com.obs.services.internal.RestStorageService.isCname(RestStorageService.java:1213) at com.obs.services.ObsClient.doActionWithResult(ObsClient.java:2805) |
此类错误一般有两种原因:
- 使用ObsClient.close接口关闭ObsClient后,再次调用ObsClient的其他接口,解决方法:仅在应用程序退出前调用ObsClient.close接口释放资源;
- 旧版OBS Java SDK的BUG,解决方法:升级到最新版本的SDK,可以从这里下载最新版本。
连接泄露问题
1
|
A connection to xxx was leaked. Did you forget to close a response body? |
此错误通常是调用ObsClient.getObject接口获取下载对象的数据流后未正常关闭,解决方法:确保在finally语句块中调用了ObsObject.getObjectContent.close方法关闭连接。
升级SDK后okhttp报错问题
1 2 3 4 5 6 |
Exception in thread "main" java.lang.NoSuchMethodError: 'okhttp3.RequestBody okhttp3.RequestBody.create(java.lang.String, okhttp3.MediaType)' at com.obs.services.internal.RestConnectionService.createRequestBuilder(RestConnectionService.java:157) at com.obs.services.internal.RestConnectionService.setupConnection(RestConnectionService.java:148) at com.obs.services.internal.RestConnectionService.setupConnection(RestConnectionService.java:124) at com.obs.services.internal.RestStorageService.performRequest(RestStorageService.java:395) at com.obs.services.internal.RestStorageService.performRequest(RestStorageService.java:388) |
此报错是因为升级SDK后okhttp使用了老版本的原因,请参考依赖缺失和依赖冲突的解决(Java SDK) ,升级okhttp到指定版本。
升级SDK后报错StackOverflowError问题
1 2 3 4 5 6 7 8 9 |
Caused by: java.lang.StackOverflowError at sun.misc.URLClassPath.getResource(URLClassPath.java:211) ~[?:1.8.0_91] at java.net.URLClassLoader$1.run(URLClassLoader.java:365) ~[?:1.8.0_91] at java.net.URLClassLoader$1.run(URLClassLoader.java:362) ~[?:1.8.0_91] at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_91] at java.net.URLClassLoader.findClass(URLClassLoader.java:361) ~[?:1.8.0_91] at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[?:1.8.0_91] at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[?:1.8.0_91] at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1806) |
检查jvm参数xss, 建议将xss参数设置为1M。xss是jvm启动的每个线程分配的内存大小,默认JDK1.4中是256K,JDK1.5+中是1M。
报错SSL peer shut down incorrectly
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
javax.net.ssl.SSLException: SSL peer shut down incorrectly at sun.security.ssl.InputRecord.readV3Record(InputRecord.java:596) at sun.security.ssl.InputRecord.read(InputRecord.java:532) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:975) at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:933) at sun.security.ssl.AppInputStream.read(AppInputStream.java:105) at obs.shaded.okio.Okio$2.read(Okio.java:140) at obs.shaded.okio.AsyncTimeout$2.read(AsyncTimeout.java:237) at obs.shaded.okio.RealBufferedSource.read(RealBufferedSource.java:51) at obs.shaded.okhttp3.internal.http1.Http1ExchangeCodec$AbstractSource.read(Http1ExchangeCodec.java:389) at obs.shaded.okhttp3.internal.http1.Http1ExchangeCodec$FixedLengthSource.read(Http1ExchangeCodec.java:427) at obs.shaded.okhttp3.internal.connection.Exchange$ResponseBodySource.read(Exchange.java:286) at obs.shaded.okio.RealBufferedSource$1.read(RealBufferedSource.java:447) at java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:238) at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:158) at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:117) at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284) at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326) at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178) at java.io.InputStreamReader.read(InputStreamReader.java:184) at java.io.BufferedReader.fill(BufferedReader.java:161) at java.io.BufferedReader.readLine(BufferedReader.java:324) at java.io.BufferedReader.readLine(BufferedReader.java:389) |
客户端下载读取文件流时,请不要按行读取,可参考流式下载的Demo。
其他问题
请参考FAQ,查看更多问题的解决方法。