Java 连接过早关闭Tomcat 7.0.52
我正在尝试修复一个web应用程序中的一个bug,该bug是在我们从Tomcat 6.0.26升级到7.0.52之后出现的。该应用程序基本上是一个从另一个网站获取内容的代理,有问题的代码如下:Java 连接过早关闭Tomcat 7.0.52,java,tomcat,Java,Tomcat,我正在尝试修复一个web应用程序中的一个bug,该bug是在我们从Tomcat 6.0.26升级到7.0.52之后出现的。该应用程序基本上是一个从另一个网站获取内容的代理,有问题的代码如下: public static synchronized void connect(String externalServiceUrl, HttpServletResponse response) throws IOException { log.info("Connecting to " + ext
public static synchronized void connect(String externalServiceUrl, HttpServletResponse response) throws IOException {
log.info("Connecting to " + externalServiceUrl);
URLConnection serverConnection = new URL(externalServiceUrl).openConnection();
serverConnection.setDoInput(true);
serverConnection.setDoOutput(false);
Map responseMap = serverConnection.getHeaderFields();
for (Iterator iterator = responseMap.keySet().iterator(); iterator.hasNext();) {
String key = (String) iterator.next();
List values = (List) responseMap.get(key);
for (int i = 0; i < values.size(); i++) {
Object o = values.get(i);
response.setHeader(key, o.toString());
}
}
OutputStream toClient = response.getOutputStream();
try {
BufferedInputStream fromServer = new BufferedInputStream(serverConnection.getInputStream());
int bytie;
try {
while ((bytie = fromServer.read()) != -1) {
toClient.write(bytie); // Exception thrown from here
}
} catch (RuntimeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
fromServer.close();
} catch (IOException e) {
log.severe("Cannot connect to external service with URL " + externalServiceUrl);
e.printStackTrace();
} finally {
toClient.flush();
toClient.close();
}
}
这通常可能表示用户已离开页面,导致浏览器关闭连接,但事实并非如此。我在Chrome、IE8和Firefox中进行了测试,结果都是一样的——浏览器上没有网页消息,服务器上没有上面的堆栈跟踪。toClient.writebyte;行的执行次数通常超过20k次,因此在连接关闭之前,大约有一半的文件被写入响应。这种情况在不到一秒钟的时间内发生,因此不太可能是由Tomcat的connectionTimeout设置(默认设置为20000ms)引起的。因此此代码不依赖于Tomcat的操作。您是否尝试将此代码移出到独立应用程序?同样的问题也存在吗?为什么使用BufferedInputStream,然后一次只读取一个字节?听起来很慢。代码不一定依赖于Tomcat,但这是我们生产中的标准容器,所以我需要一个在这方面工作的解决方案。将Tomcat版本回滚到6.0.26解决了这个问题。关于BufferedInputStream的使用方式…不确定,我没有编写它。有很多方法可以稍微整理一下代码,但我只想先解决主要问题。谢谢你的建议。
ClientAbortException: java.net.SocketException: Connection reset
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:413)
at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:480)
at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:310)
at org.apache.catalina.connector.OutputBuffer.writeByte(OutputBuffer.java:457)
at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:77)
at org.springframework.security.web.context.SaveContextOnUpdateOrErrorResponseWrapper$SaveContextServletOutputStream.write(SaveContextOnUpdateOrErrorResponseWrapper.java:203)
at nz.cri.gns.boardaccess.proxy.ProxyHelper.connect(ProxyHelper.java:72)
...
Caused by: java.net.SocketException: Connection reset
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)