performance - 从tomcat中的输入流获取数据时出现SocketTimeoutException
问题描述
从输入流中读取数据时出现 sockettimeeout 异常
源代码
public void clientData(HttpServletRequest request, HttpServletResponse response){
InputStream in = request.getInputStream();
String body = null;
body = IOUtils.toString(in);
}
org.apache.catalina.connector.ClientAbortException: java.net.SocketTimeoutException|
at org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:348)|
at org.apache.catalina.connector.InputBuffer.checkByteBufferEof(InputBuffer.java:663)|
at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:370)|
at org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:183)|
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.Reader.read(Reader.java:140)|
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1680)|
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1659)|
at org.apache.commons.io.IOUtils.copy(IOUtils.java:1636)|
at org.apache.commons.io.IOUtils.copy(IOUtils.java:1583)|
at org.apache.commons.io.IOUtils.copy(IOUtils.java:1608)|
at org.apache.commons.io.IOUtils.toString(IOUtils.java:668)|
at org.apache.commons.io.IOUtils.toString(IOUtils.java:646)|
Caused by: java.net.SocketTimeoutException|
at org.apache.tomcat.util.net.NioBlockingSelector.read(NioBlockingSelector.java:201)|
at org.apache.tomcat.util.net.NioSelectorPool.read(NioSelectorPool.java:235)|
at org.apache.tomcat.util.net.NioSelectorPool.read(NioSelectorPool.java:216)|
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1282)|
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1225)|
at org.apache.coyote.http11.Http11InputBuffer.fill(Http11InputBuffer.java:737)|
at org.apache.coyote.http11.Http11InputBuffer.access$300(Http11InputBuffer.java:42)|
at org.apache.coyote.http11.Http11InputBuffer$SocketInputBuffer.doRead(Http11InputBuffer.java:1120)|
at org.apache.coyote.http11.filters.IdentityInputFilter.doRead(IdentityInputFilter.java:140)|
at org.apache.coyote.http11.Http11InputBuffer.doRead(Http11InputBuffer.java:262)|
at org.apache.coyote.Request.doRead(Request.java:581)|
at org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:344)|
... 59 more|
server.xml 具有以下配置
连接超时="20000" maxThread="150"
有数千个客户端同时访问tomcat服务器
注意:无法重现上述情况,有时会出现此异常
在 server.xml 中达到 20 秒 (connectionTimeout) 后发生异常
解决方案
发现一个问题,问题是由于客户端和服务器之间的带宽造成的。当我们减少客户端和服务器之间的流量(请求数据大小减少)时
它工作没有问题
推荐阅读
- django - 如何使用自定义权限和 APIView 实现基于许可证的用户访问?
- google-bigquery - 从 mysql 到 bigquery 的数据
- sharepoint - 更改群组网站的布局
- node.js - 使用 IBM Watson 进行情绪分析
- android - AlertDIalog 删除不必要的空间
- python - Python字典追加到键?
- java - 页面未在弹簧启动时加载
- swift - 模仿 Swift 结合 @Published 创建 @PublishedAppStorage
- visual-studio - 如何使用 Visual Studio 的 sonarlint 扩展检测新引入的代码异味/泄漏
- php - Wordpress category.php 返回空