Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 连接过早关闭Tomcat 7.0.52_Java_Tomcat - Fatal编程技术网

Java 连接过早关闭Tomcat 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

我正在尝试修复一个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 " + 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)