Uploaded image for project: 'CXF'
  1. CXF
  2. CXF-5414

XMLStreamException when using Continuations in versions > 2.7.0

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 2.7.1, 2.7.2, 2.7.3, 2.7.4, 2.7.5, 2.7.6, 2.7.7
    • 2.7.9
    • JAX-WS Runtime
    • Ubuntu 12.04, Ubuntu 13.04, Java 7, Apache Tomcat 7.0.42

    • Unknown

    Description

      When using Continuation in a Jax web service a stacktrace is printed after every call, the web service does work as expected. If a new web service call is executed while waiting for the stacktrace (in Apache Tomcat the stacktrace appears after about 10 seconds) the web service is very slow. Some calls take up to 8 seconds to complete.

      This only occurs with CXF versions above 2.7.0. Tested versions: 2.7.1, 2.7.2, 2.7.3 and 2.7.7.

      Example project attached.

      Continuation web service code
          public String test() {
              final Continuation continuation = getContinuation();
      
              if (continuation == null) {
                  throw new RuntimeException("Failed to get continuation");
              }
      
              synchronized (continuation) {
                  if(continuation.isNew()) {
                      FutureTask futureResponse = new FutureTask<>(new Callable<String>() {
                          @Override
                          public String call() throws Exception {
                              Thread.sleep(1000);
                              String response = "Test response";
                              // the blocking call has finished, we resume the transport thread
                              continuation.resume();
      
                              return response;
                          }
                      });
                      taskExecutor.execute(futureResponse);
                      continuation.setObject(futureResponse);
      
                      // suspend the transport thread so it can handle other requests
                      continuation.suspend(CONTINUATION_TIMEOUT);
                      return null;
                  } else {
                      FutureTask futureTask = (FutureTask) continuation.getObject();
                      if(futureTask.isDone()) {
                          try {
                              return (String) futureTask.get();
                          } catch (InterruptedException | ExecutionException e) {
                              e.printStackTrace();
                          }
                      } else {
                          continuation.suspend(CONTINUATION_TIMEOUT);
                      }
                  }
              }
              // unreachable
              return null;
          }
      
          private Continuation getContinuation() {
              ContinuationProvider provider = (ContinuationProvider) context.getMessageContext().get(ContinuationProvider.class.getName());
              return provider.getContinuation();
          }
      
      Stacktraces
      Nov 21, 2013 10:15:53 PM org.apache.cxf.phase.PhaseInterceptorChain doDefaultLogging
      WARNING: Interceptor for {http://continuation.example.com/}ContinuationWebServiceService#{http://continuation.example.com/}test has thrown exception, unwinding now
      java.lang.RuntimeException: Can't find input stream in message
      	at org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handleMessage(ReadHeadersInterceptor.java:145)
      	at org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handleMessage(ReadHeadersInterceptor.java:62)
      	at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
      	at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
      	at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:239)
      	at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:248)
      	at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:222)
      	at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:153)
      	at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:167)
      	at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:286)
      	at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:206)
      	at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
      	at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:262)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
      	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:749)
      	at org.apache.catalina.core.ApplicationDispatcher.doDispatch(ApplicationDispatcher.java:660)
      	at org.apache.catalina.core.ApplicationDispatcher.dispatch(ApplicationDispatcher.java:626)
      	at org.apache.catalina.core.AsyncContextImpl$1.run(AsyncContextImpl.java:225)
      	at org.apache.catalina.core.AsyncContextImpl.doInternalDispatch(AsyncContextImpl.java:367)
      	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:217)
      	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
      	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
      	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
      	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
      	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
      	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
      	at org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:299)
      	at org.apache.coyote.http11.AbstractHttp11Processor.asyncDispatch(AbstractHttp11Processor.java:1587)
      	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:583)
      	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
      	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
      	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
      	at java.lang.Thread.run(Thread.java:722)
      
      Nov 21, 2013 10:15:53 PM org.apache.cxf.phase.PhaseInterceptorChain doDefaultLogging
      WARNING: Interceptor for {http://continuation.example.com/}ContinuationWebServiceService#{http://continuation.example.com/}test has thrown exception, unwinding now
      org.apache.cxf.binding.soap.SoapFault: Error writing to XMLStreamWriter.
      	at org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor$SoapOutEndingInterceptor.handleMessage(SoapOutInterceptor.java:300)
      	at org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor$SoapOutEndingInterceptor.handleMessage(SoapOutInterceptor.java:282)
      	at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
      	at org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:113)
      	at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:333)
      	at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
      	at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:239)
      	at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:248)
      	at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:222)
      	at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:153)
      	at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:167)
      	at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:286)
      	at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:206)
      	at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
      	at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:262)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
      	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:749)
      	at org.apache.catalina.core.ApplicationDispatcher.doDispatch(ApplicationDispatcher.java:660)
      	at org.apache.catalina.core.ApplicationDispatcher.dispatch(ApplicationDispatcher.java:626)
      	at org.apache.catalina.core.AsyncContextImpl$1.run(AsyncContextImpl.java:225)
      	at org.apache.catalina.core.AsyncContextImpl.doInternalDispatch(AsyncContextImpl.java:367)
      	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:217)
      	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
      	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
      	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
      	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
      	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
      	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
      	at org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:299)
      	at org.apache.coyote.http11.AbstractHttp11Processor.asyncDispatch(AbstractHttp11Processor.java:1587)
      	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:583)
      	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
      	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
      	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
      	at java.lang.Thread.run(Thread.java:722)
      Caused by: javax.xml.stream.XMLStreamException: No open start element, when trying to write end element
      	at com.ctc.wstx.sw.BaseStreamWriter.throwOutputError(BaseStreamWriter.java:1522)
      	at com.ctc.wstx.sw.BaseStreamWriter.reportNwfStructure(BaseStreamWriter.java:1551)
      	at com.ctc.wstx.sw.BaseNsStreamWriter.doWriteEndTag(BaseNsStreamWriter.java:648)
      	at com.ctc.wstx.sw.BaseNsStreamWriter.writeEndElement(BaseNsStreamWriter.java:280)
      	at org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor$SoapOutEndingInterceptor.handleMessage(SoapOutInterceptor.java:291)
      	... 35 more
      

      Attachments

        1. ContinuationTest.zip
          30 kB
          Mark van den Bergh

        Activity

          People

            dkulp Daniel Kulp
            markvandenbergh Mark van den Bergh
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: