[
https://issues.apache.org/jira/browse/CXF-5414?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Daniel Kulp resolved CXF-5414.
------------------------------
Resolution: Fixed
Fix Version/s: (was: 2.7.0)
2.7.9
Assignee: Daniel Kulp
> XMLStreamException when using Continuations in versions > 2.7.0
> ---------------------------------------------------------------
>
> Key: CXF-5414
> URL: https://issues.apache.org/jira/browse/CXF-5414
> Project: CXF
> Issue Type: Bug
> Components: JAX-WS Runtime
> Affects Versions: 2.7.1, 2.7.2, 2.7.3, 2.7.4, 2.7.5, 2.7.6, 2.7.7
> Environment: Ubuntu 12.04, Ubuntu 13.04, Java 7, Apache Tomcat 7.0.42
> Reporter: Mark van den Bergh
> Assignee: Daniel Kulp
> Labels: continuation, future, threading
> Fix For: 2.7.9
>
> Attachments: ContinuationTest.zip
>
>
> 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.
> {code:title=Continuation web service code|borderStyle=solid}
> 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();
> }
> {code}
> {code:title=Stacktraces|borderStyle=solid}
> 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
> {code}
--
This message was sent by Atlassian JIRA
(v6.1#6144)