Amazon web services tomcat抛出java.net.SocketTimeoutException:当应用程序在elb后面运行且响应在http上流式传输时为null

Amazon web services tomcat抛出java.net.SocketTimeoutException:当应用程序在elb后面运行且响应在http上流式传输时为null,amazon-web-services,spring-boot,jersey,streaming,amazon-elb,Amazon Web Services,Spring Boot,Jersey,Streaming,Amazon Elb,我陷入了过去几天的一个问题: 我有一个spring boot应用程序在elb后面的aws ecs上运行。 应用程序正在公开一个jersey端点,该端点正在下载750 MB的数据 来自aws-s3的文件分块存储。我们从s3和s3获取输入流 在HTTP上传输它。在下载过程中(大约400MB的下载量),我们会看到下面的异常 Caused by: org.apache.catalina.connector.ClientAbortException: java.net.SocketTimeo

我陷入了过去几天的一个问题: 我有一个spring boot应用程序在elb后面的aws ecs上运行。 应用程序正在公开一个jersey端点,该端点正在下载750 MB的数据
来自aws-s3的文件分块存储。我们从s3和s3获取输入流 在HTTP上传输它。在下载过程中(大约400MB的下载量),我们会看到下面的异常

 Caused by: org.apache.catalina.connector.ClientAbortException: 
     java.net.SocketTimeoutException
    at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:380)
    at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:350)
    at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:405)
    at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:393)
    at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:96  )
    at org.glassfish.jersey.servlet.internal.ResponseWriter$NonCloseableOutputStreamWrapper.write(ResponseWriter.java:325)
    at org.glassfish.jersey.message.internal.CommittingOutputStream.write(CommittingOutputStream.java:229)
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$UnCloseableOutputStream.write(WriterInterceptorExecutor.java:299)Caused by: java.net.SocketTimeoutException: null
    at org.apache.tomcat.util.net.NioBlockingSelector.write(NioBlockingSelector.java:134)
    at org.apache.tomcat.util.net.NioSelectorPool.write(NioSelectorPool.java:157)
    at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.doWrite(NioEndpoint.java:1221)
    at org.apache.tomcat.util.net.SocketWrapperBase.writeBlocking(SocketWrapperBase.java:378)
    at org.apache.tomcat.util.net.SocketWrapperBase.write(SocketWrapperBase.java:347) at org.apache.coyote.http11.Http11OutputBuffer$SocketOutputBuffer.doWrite(Http11OutputBuffer.java:561)
    at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:112)
我对此进行了研究,并在google上找到了一些常用的解决方案,指示保持:空闲时间从
elb
设置为更高的值,并将tomcat的
keepalivetimeout
设置为更高的值,当我将这两个属性都设置为1800时,它开始工作,但我不想在不了解根本原因的情况下,将这些值设置为“否”

另外,我进入tomcat类,找到了引发异常的实际代码行,但仍然无法找出原因

而且,无法理解为什么只有在应用程序运行时才会发生这种情况 在aws elb后面。
有人对此有线索吗?

我遇到了与您类似的问题,让我尝试解释问题的根本原因: 数据流来自“Spring Boot Application”-->ELB-->客户端。“Spring Boot Application”和ELB位于同一网络上,因此它们之间的网络速度非常快。但是ELB和客户端之间的网络速度不是很快。 假设ELB内存缓冲区和网络缓冲区中充满了数据,因为数据没有及时传输到客户机,那么会发生什么情况:由于没有足够的空间来接收来自服务器的数据,所以在“超时”秒内无法将微小的4k字节发送到ELB,因此将抛出SocketTimeoutException“Spring启动应用程序”(应该立即完成)。
因此,我的猜测是,如果超时足够小,或者ELB和客户端之间的网络速度足够慢,问题总是会发生。

您可以通过调用sleep来模拟一个缓慢的客户端,然后尝试根据新的keepalivetimeout参数重现错误。我的猜测是错误再次发生。