首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java.io.IOException:流关闭- on Tomcat 8- JavaMelody - JAX WS

java.io.IOException:流关闭- on Tomcat 8- JavaMelody - JAX WS
EN

Stack Overflow用户
提问于 2016-01-22 08:03:52
回答 1查看 2.2K关注 0票数 3

我已经将Tomcat从第7版升级到了8.0.30版。在调用WebService方法之前,一切正常工作,该方法应该返回一个结果。

编辑: 25.01.2016响应似乎是空的,甚至连根标记都找不到。

当我切换回Tomcat 7时,一切正常。我不知道到哪里去找点子。你能帮我解决我的问题吗?

代码语言:javascript
复制
SEVERE: Servlet.service() for servlet [Dynamic JAXWS Servlet] in 
context   with path [/edmwas] threw exception
java.io.IOException: Stream closed
at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:170)
at java.io.BufferedInputStream.reset(BufferedInputStream.java:446)
at net.bull.javamelody.PayloadNameRequestWrapper.resetBufferedInputStream(PayloadNameRequestWrapper.java:139)
at net.bull.javamelody.PayloadNameRequestWrapper.initialize(PayloadNameRequestWrapper.java:118)
at net.bull.javamelody.MonitoringFilter.createRequestWrapper(MonitoringFilter.java:278)
at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:185)
at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:178)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:521)
at org.apache.coyote.ajp.AbstractAjpProcessor.process(AbstractAjpProcessor.java:850)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:664)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)

以下是javamelody PayloadNameRequestWrapper的摘录

代码语言:javascript
复制
protected void initialize() throws IOException {
    //name on a best-effort basis
    name = null;
    requestType = null;

    final HttpServletRequest request = (HttpServletRequest) getRequest();
    final String contentType = request.getContentType();
    if (contentType == null) {
        //don't know how to handle this content type
        return;
    }

    if (!"POST".equalsIgnoreCase(request.getMethod())) {
        //no payload
        return;
    }

    //Try look for name in payload on a best-effort basis...
    try {
        if (contentType.startsWith("text/x-gwt-rpc")) {
            //parse GWT-RPC method name
            name = parseGwtRpcMethodName(getBufferedInputStream(), getCharacterEncoding());
            requestType = "GWT-RPC";
        } else if (contentType.startsWith("application/soap+xml") //SOAP 1.2
                || contentType.startsWith("text/xml") //SOAP 1.1
                && request.getHeader("SOAPAction") != null) {
            //parse SOAP method name
            name = parseSoapMethodName(getBufferedInputStream(), getCharacterEncoding());
            requestType = "SOAP";
        } else {
            //don't know how to name this request based on payload
            //(don't parse if text/xml for XML-RPC, because it is obsolete)
            name = null;
            requestType = null;
        }
    } catch (final Exception e) {
        LOG.debug("Error trying to parse payload content for request name", e);

        //best-effort - couldn't figure it out
        name = null;
        requestType = null;
    } finally {
        //reset stream so application is unaffected
        resetBufferedInputStream();
    }
}

protected BufferedInputStream getBufferedInputStream() throws IOException {
    if (bufferedInputStream == null) {
        //workaround Tomcat issue with form POSTs
        //see http://stackoverflow.com/questions/18489399/read-httpservletrequests-post-body-and-then-call-getparameter-in-tomcat
        final ServletRequest request = getRequest();
        request.getParameterMap();

        //buffer the payload so we can inspect it
        bufferedInputStream = new BufferedInputStream(request.getInputStream());
        // and mark to allow the stream to be reset
        bufferedInputStream.mark(Integer.MAX_VALUE);
    }
    return bufferedInputStream;
}


protected void resetBufferedInputStream() throws IOException {
    if (bufferedInputStream != null) {
        bufferedInputStream.reset(); // Exception happens here
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-18 15:13:50

此问题与AJP连接器有关,并不是在每个tomcat版本中都出现。一个bugreport已经存在:bug.cgi?id=58481

在bug报告中,您可以找到一篇文章,上面写着

  • Tomcat 7应该工作到7.0.59版本。错误出现在7.0.61版中。
  • Tomcat 8应该工作到8.0.20版本。错误出现在8.0.21版中。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34941788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档