2016-01-22 67 views
1

我已經將我的Tomcat從版本7升級到版本8.0.30。一切正常,直到一個WebService方法被調用,它應該返回一個結果。java.io.IOException:流關閉 - 在Tomcat 8上 - JavaMelody - JAX WS

[編輯:25.01.2016]看起來響應是空的,甚至找不到根標籤。

當我切換回Tomcat 7時,一切正常。 我不知道在哪裏尋找想法。你能幫我解決我的問題嗎?

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

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 
    } 
} 
+1

我認爲可以爲您發佈的觸發異常 –

+0

我加javamelody有些線路的方法有用 - PayloadNameRequestWrapper.java –

回答

0

這個問題,是關係到AJP連接器,並沒有出現在每一個版本的Tomcat的提取物。問題回報的已經存在: https://bz.apache.org/bugzilla/show_bug.cgi?id=58481

在bug報告,你可以找到一個帖子裏也說,

  • 的Tomcat 7應該工作到7.0.59版本。錯誤出現在 版本7.0.61
  • Tomcat 8應該工作到版本8.0.20。該錯誤出現在 版本8.0.21