uploadPart失败,无法执行HTTP请求:连接重置

sam*_*nth 5 java amazon-s3 amazon-web-services

我正在尝试使用分段上传AWS S3 java API执行文件上传(我使用的是SDK 1.8.1).我能够成功执行上传.

但是,间歇性地我不断得到这个例外.

2014年7月31日上午4:39:38 com.amazonaws.http.AmazonHttpClient executeHelper INFO:无法执行HTTP请求:连接重置java.net.SocketException:java.net.SocketInputStream.read上的连接重置(SocketInputStream.java:189 )在sun.security.ssl.InputRecord.read(readRecord.java:312)的sun.security.ssl.InputRecord.readFully(InputRecord.java:312)的java.net.SocketInputStream.read(SocketInputStream.java:121)处(InputRecord.java:350) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:927)at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:884)at sun.security.ssl.AppInputStream.read(AppInputStream.java:102 )org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:166)org.apache.http.impl.io.SocketInputBuffer.fillBuffer(SocketInputBuffer.java:90)at org.apache.http. impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:281)at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponsePar)ser.java:92)org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:62)org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:254)at org .apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:289)org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:252)at org.apache.http.impl.conn.ManagedClientConnectionImpl .receiveResponseHeader(ManagedClientConnectionImpl.java:191)org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:300)at org.在com.amazonaws.http.protocol.SdkHttpRequestExecutor.doReceiveResponse(SdkHttpRequestExecutor.java:66). apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:127)位于org.apache.http.impl.client.DefaultRequestDirector的org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:717).执行(DefaultRequest Director.java:522)atg.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:402)at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:245)at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3711) )在云上的com.amazonaws.services.s3.AmazonS3Client.uploadPart(AmazonS3Client.java:2809).< - filename - > .writeContent(< - filename - > .java:< - linenumber->)

在以下代码中

try {
                  _partETags.add(_s3.uploadPart(uploadPartReq).getPartETag());
      } catch (AmazonClientException e) {
                  System.out.println("Amazon service error. Retrying...");
                  printException(e);
      } catch (Exception e) {
                  printException(e);
                  throw new UserException("Received an exception while performing upload part");
      }
Run Code Online (Sandbox Code Playgroud)

如果我看一下docuementation,它说uploadPart函数只会抛出两个类AmazonClientException和AmazonServiceException.

链接:http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3.html#uploadPart(com.amazonaws.services.s3.model.UploadPartRequest)

<documentation>
...
UploadPartResult uploadPart(UploadPartRequest request)
throws AmazonClientException,
AmazonServiceException
...
Throws:
AmazonClientException - If any errors are encountered in the client while making the request or handling the response.
AmazonServiceException - If any errors occurred in Amazon S3 while processing the request. 
...
</documentation>
Run Code Online (Sandbox Code Playgroud)

但是,我收到了不同的例外.

我有以下问题

  • 这是预期的行为,如果不是我如何解决这个问题?
  • 为什么我的try catch块无法捕获此异常?
  • 在AmazonClient或AmazonServiceException的情况下,是否建议我们再次重试上传,还是应将其视为不可恢复的错误?

Dav*_*ray 1

这是来自 AmazonS3Client 的一条日志消息(INFO 级别),告诉您存在暂时性网络错误。默认情况下,AmazonS3Client 会捕获此类异常并为您重试上传。您可以通过ClientConfiguration调整此行为。如果在配置的重试次数后上传仍未成功,则会AmazonClientException根据文档抛出错误。