当前位置: 首页 > 知识库问答 >
问题:

我应该如何处理多线程AWS S3文件上传中的“java.net.socketexception:连接重置”?

姚航
2023-03-14

我有一个ThreadPoolExecutorService向其提交可运行的作业,这些作业使用AWS Java SDK将大(1-2 GB)文件上传到AmazonS3文件系统。偶尔,我的一个工作线程会报告一个java.net.SocketException(以“连接重置”为原因),然后死亡。

AWS不使用检查异常,所以我实际上不能直接捕获SocketException----它必须以某种方式包装。我的问题是我应该如何处理这个问题,以便我可以重试任何有问题的上传,并增加我的程序的可靠性。

这是堆栈跟踪。com.example.*代码是我的。DataProcessorAWS调用所做的基本上是在跨线程共享的Amazons3Client实例上调用putObject(String bucketName,String key,File File)

14/12/11 18:43:17 INFO http.AmazonHttpClient: Unable to execute HTTP request: Connection reset
java.net.SocketException: Connection reset
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:118)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:159)
    at sun.security.ssl.OutputRecord.writeBuffer(OutputRecord.java:377)
    at sun.security.ssl.OutputRecord.write(OutputRecord.java:363)
    at sun.security.ssl.SSLSocketImpl.writeRecordInternal(SSLSocketImpl.java:830)
    at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:801)
    at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:122)
    at org.apache.http.impl.io.AbstractSessionOutputBuffer.write(AbstractSessionOutputBuffer.java:169)
    at org.apache.http.impl.io.ContentLengthOutputStream.write(ContentLengthOutputStream.java:119)
    at org.apache.http.entity.InputStreamEntity.writeTo(InputStreamEntity.java:102)
    at com.amazonaws.http.RepeatableInputStreamRequestEntity.writeTo(RepeatableInputStreamRequestEntity.java:153)
    at org.apache.http.entity.HttpEntityWrapper.writeTo(HttpEntityWrapper.java:98)
    at org.apache.http.impl.client.EntityEnclosingRequestWrapper$EntityWrapper.writeTo(EntityEnclosingRequestWrapper.java:108)
    at org.apache.http.impl.entity.EntitySerializer.serialize(EntitySerializer.java:122)
    at org.apache.http.impl.AbstractHttpClientConnection.sendRequestEntity(AbstractHttpClientConnection.java:271)
    at org.apache.http.impl.conn.ManagedClientConnectionImpl.sendRequestEntity(ManagedClientConnectionImpl.java:197)
    at org.apache.http.protocol.HttpRequestExecutor.doSendRequest(HttpRequestExecutor.java:257)
    at com.amazonaws.http.protocol.SdkHttpRequestExecutor.doSendRequest(SdkHttpRequestExecutor.java:47)
    at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125)
    at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:715)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:520)
    at org.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.executeOneRequest(AmazonHttpClient.java:685)
    at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:460)
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:295)
    at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3697)
    at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1434)
    at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1294)
    at com.example.DataProcessorAWS$HitWriter.close(DataProcessorAWS.java:156)
    at com.example.DataProcessorAWS$Processor.run(DataProcessorAWS.java:264)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

共有1个答案

谢誉
2023-03-14

javadoc说,当发生这种错误时,putObject()抛出AmazonClientException。AmazonClientException有一个名为isRetryable()的方法,您可以尝试使用它。

 类似资料:
  • 我正在使用多个线程在不同的表中插入插入记录。此外,我正在使用批处理的记录插入,以提高效率。 注意:要插入的记录数以百万为单位。 我的问题是,在这种多线程环境中,我应该使用连接池吗? 我关心的问题: 每个线程将运行相当长的时间来执行数据库操作。所以,如果我的连接池的大小是2,线程的数量是4,那么在给定的时刻只有2个线程将运行。因此,其他两个线程将会在很长一段时间内保持理想状态以获得连接,因为针对百万

  • 问题内容: 我在尝试从套接字读取时遇到以下错误。我正在执行该操作,并且出现此错误。仔细阅读文档,这表明连接的客户端部分关闭了连接。在这种情况下,我是服务器。 我可以访问客户端日志文件,但它没有关闭连接,实际上它的日志文件表明我正在关闭连接。有人知道为什么会这样吗?还有什么要检查的?当有本地资源可能达到阈值时,会出现这种情况吗? 我确实注意到我有以下几行: 就在readInt()。这是有原因的(长话

  • 在我们进行负载测试(使用jmeter)之前,一切都很好。当我们模拟100个并发用户时,在3-4分钟后。jmeter开始记录SocketException,连接重置。当我们检查应用程序日志(我们记录应用程序内部的所有异常)和系统事件时,我们什么也找不到。 我们没有对web层的性能采取任何特殊措施。但是在作为wcf应用程序的应用层上,我们使用了每次调用/多并发。我们在应用层上使用了以下配置: ...

  • 问题内容: 我发现了以下很棒的主题,并解释了如何使用新的HTML5 FormDataAPI通过AJAX / Jquery上传文件 这是该代码的稍有更新的版本,具有更新的JQuery 1.8+语法 这是表格 在服务器端,我们有类似的东西。 这很好。直到您决定在文件对话框中使用“多个”属性,然后发送多个文件。 您会在网上找到各种页面,提出以下解决方案 哎呀。不起作用 不。不起作用 甚至不 编译 你猜怎

  • 问题内容: Netbeans IDE中的Java,Hibernate,MySQL项目中出现异常。 我做了一些挖掘工作,以尝试修复此奇怪的Socket异常,但无济于事。 一些论坛解决方案建议为Hibernate实现c3p0连接池。没有修复。 其他人建议禁用AV和防火墙(!!),因为它们可能会干扰套接字连接。没有修复。 我已经用Hibernate标记了这个问题,因为我不确定是休眠的原因,但是异常发生在

  • 我的问题陈述。读取包含1000万数据的csv文件,并将其存储在数据库中。用尽可能少的时间 我使用java的简单多线程执行器实现了它,其逻辑几乎与spring batch的chunk相似。从csv文件中读取预配置数量的数据,然后创建一个线程,并将数据传递给线程,该线程验证数据,然后写入多线程运行的文件。完成所有任务后,我将调用sql loader来加载每个文件。现在我想把这段代码移到spring b