2016-01-22 7 views
1

Я обновил Tomcat с версии 7 до версии 8.0.30. Все работает нормально до тех пор, пока не будет вызван метод WebService, который должен вернуть результат.java.io.IOException: Stream закрыт на 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

В сообщении об ошибке вы можете найти пост, где он говорит, что

  • Tomcat 7 должен работать до версии 7.0.59. Ошибка появляется в Версия 7.0.61
  • Tomcat 8 должен работать до версии 8.0.20. Появляется ошибка в версии 8.0.21