[
https://issues.apache.org/jira/browse/CXF-5659?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13950755#comment-13950755
]
Sergey Beryozkin commented on CXF-5659:
---------------------------------------
Besides I also see this line: "If startAsync is subsequently called on the
dispatched request, then any of the dispatch or complete() methods may be
called". How that correlates with the relevant documentation is very difficult
to understand so once again I'm thinking keeping the catch block is the best
thing for now.
> IllegalStateException on Async call
> -----------------------------------
>
> Key: CXF-5659
> URL: https://issues.apache.org/jira/browse/CXF-5659
> Project: CXF
> Issue Type: Bug
> Components: Transports
> Affects Versions: 2.7.10
> Reporter: Stephen Dawkins
> Priority: Minor
> Labels: continuation
>
> I've come acrossed an odd exception when attempting to use an Async JAX-WS
> Provider:
> {code}java.lang.IllegalStateException: s=DISPATCHED i=false a=null
> at
> org.eclipse.jetty.server.HttpChannelState.complete(HttpChannelState.java:430)
> at
> org.eclipse.jetty.server.AsyncContextState.complete(AsyncContextState.java:92)
> at
> org.apache.cxf.transport.http.Servlet3ContinuationProvider$Servlet3Continuation.reset(Servlet3ContinuationProvider.java:131)
> at
> org.apache.cxf.transport.http.Servlet3ContinuationProvider.complete(Servlet3ContinuationProvider.java:55)
> at
> org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:242)
> 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:707)
> at
> org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:262)
> at
> org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:717)
> at
> org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:552)
> at
> org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
> at
> org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:544)
> at
> org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:221)
> at
> org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1112)
> at
> org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:479)
> at
> org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:183)
> at
> org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1046)
> at
> org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
> at
> org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
> at
> org.eclipse.jetty.server.handler.StatisticsHandler.handle(StatisticsHandler.java:159)
> at
> org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
> at org.eclipse.jetty.server.Server.handleAsync(Server.java:516)
> at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:288)
> at org.eclipse.jetty.server.HttpChannel.run(HttpChannel.java:237)
> at
> org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:607)
> at
> org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:536)
> at java.lang.Thread.run(Thread.java:722){code}
> From what I've been able to determine, it appears it is attempting to call
> AsyncContext.complete() after AsyncContext.dispatch() has been called from
> Servlet3Continuation.redispatch()/resume().
> I changed the Servlet3.Continuation.reset() method to this to 'fix' it:
> {code:java} public void reset() {
> if (!isResumed) {
> context.complete();
> }
> obj = null;
> }{code}
> But I'm not sure if that's correct.
> I also changed the Servlet3Continuation.startAsyncAgain() method, as I
> spotted it adding a duplicate listener:
> {code:java} void startAsyncAgain() {
> AsyncContext old = context;
> try {
> context = req.startAsync();
> context.addListener(this);
> } catch (IllegalStateException ex) {
> context = old;
> }
> }{code}
--
This message was sent by Atlassian JIRA
(v6.2#6252)