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

Posted

技术标签:

【中文标题】uploadPart 失败,无法执行 HTTP 请求:连接重置【英文标题】:uploadPart is failing with Unable to execute HTTP request: Connection reset 【发布时间】:2014-08-14 10:46:29 【问题描述】:

我正在尝试使用分段上传 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) 在 java.net.SocketInputStream.read(SocketInputStream.java:121) 在 sun.security.ssl.InputRecord.readFully(InputRecord.java:312) 在 sun.security.ssl.InputRecord.read(InputRecord.java:350) 在 sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:927) 在 sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:884) 在 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) 在 org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:281) 在 org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:92) 在 org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:62) 在 org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:254) 在 org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:289) 在 org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:252) 在 org.apache.http.impl.conn.ManagedClientConnectionImpl.receiveResponseHeader(ManagedClientConnectionImpl.java:191) 在 org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:300) 在 com.amazonaws.http.protocol.SdkHttpRequestExecutor.doReceiveResponse(SdkHttpRequestExecutor.java:66) 在 org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:127) 在 org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:717) 在 org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:522) 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906) 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805) 在 com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:402) 在 com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:245) 在 com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3711) 在 com.amazonaws.services.s3.AmazonS3Client.uploadPart(AmazonS3Client.java:2809) 在云端。.writeContent(.java:)

如下代码

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");
      

如果我查看文档,它说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>

但是,我收到了不同的例外情况。

我有以下问题

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

【问题讨论】:

我看到同样的事情 【参考方案1】:

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

【讨论】:

【参考方案2】:

当我尝试通过 Eclipse 上传我的项目 AWS lambda 时,我按照教程链接中的步骤操作:

https://examples.javacodegeeks.com/software-development/amazon-aws/tutorial-use-aws-lambda-s3-real-time-data-processing/

但是在执行“将 Lambda 代码部署到 AWS”步骤时 ===> 在 Eclipse 中,右键单击您的代码并选择 Amazon Web Services > Upload function to Lambda...

我遇到的错误: 1) 我收到一个错误窗口,显示消息“无法将项目上传到 Lambda 无法执行 HTTP 请求:对等方重置连接:套接字写入错误

2) 我的 Stack Tarce 的第一行异常是: “com.amazonaws.SdkClientException:无法执行 HTTP 请求:对等方重置连接:套接字写入错误 原因:java.net.SocketException: Connection reset by peer: socket write error"

3) Eclipse 错误日志给出消息:“java.lang.NullPointerException at org.eclipse.core.databinding.ValueBinding.doUpdate(ValueBinding.java:158)”

然后我通过在我的 eclipse 网络连接中做一个小的更改来更改设置,因为我的代理设置阻止将我的项目上传到 lambda,我想出了如下解决方案:

解决方案: Window -> Preferences -> General -> Network Connection -> Active Provider as "Direct"。

然后尝试使用相同的步骤在 lambda 上上传项目,它对我有用。 希望这对你也有帮助。

【讨论】:

以上是关于uploadPart 失败,无法执行 HTTP 请求:连接重置的主要内容,如果未能解决你的问题,请参考以下文章

Apollo 客户端无法连接到 GraphQL 服务器(http 调用执行失败)

AWS Glue 作业失败:调用 o71.getDynamicFrame..SdkClientException 时发生错误:无法执行 HTTP 请求:Connect .s3..connect 超时

“无法执行 HTTP 请求:连接到 <bucket-name>.s3.amazonaws.com:443 失败:连接超时

[INS-30131]执行安装程序验证所需的初始设置失败(无法访问临时位置)解决方法!

任务应用程序执行失败生成调试构建配置

Error-Oracle:[INS-30131]执行安装程序验证所需的初始设置失败(无法访问临时位置)解决方法!