[
https://issues.apache.org/jira/browse/CXF-7575?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16275019#comment-16275019
]
Sergey Beryozkin commented on CXF-7575:
---------------------------------------
There's a test here
https://github.com/apache/cxf/blob/master/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookContinuationStore.java#L67
Can you please prepare a test case, even if it will not fail on every request
but randomly, it will be a start...I guess much depends on the servlet
container as well, may be which Java version, etc
> @Suspended race condition
> -------------------------
>
> Key: CXF-7575
> URL: https://issues.apache.org/jira/browse/CXF-7575
> Project: CXF
> Issue Type: Bug
> Components: JAX-RS
> Affects Versions: 3.1.14
> Reporter: John Bellassai
>
> There appears to be a race condition with the use of AsyncResponseImpl where
> my user thread can invoke resume() before initialSuspend is set to false by
> suspendContinuationIfNeeded() and therefore the resume() call does not
> actually resume the Continuation _and returns true_, indicating that the
> resume was successful even though it wasn't.
> I've spent all day trying to make sense of this problem and my understanding
> of how all of this works together is still a bit spotty, but it seems to me
> that AsyncResponseImpl.suspendContinuationIfNeeded() (or something similar)
> should be called _before_ invoking the JAXRS method. Right now, that method
> is only called after the JAXRS method is invoked by JAXRSInvoker so the
> instance of AsyncResponse passed into the JAXRS method appears to not
> actually get suspended (or perhaps _marked_ internally as suspended) until
> after the JAXRS method returns. If my async task happens to get finished
> very quickly and calls resume() before that happens, it fails silently.
> I seem to be able to circumvent this problem by running the following at the
> start of my JAXRS method (pseudo code):
> {code}
> @POST
> @Path(....)
> void myJaxrsMethod(@Suspended AsyncResponse asyncResponse, ...) {
> if(asyncResponse instanceof AsyncResponseImpl) {
> ((AsyncResponseImpl)asyncResponse).suspendContinuationIfNeeded()
> }
> Runnable asyncTask = createAsyncTask(asyncResponse)
> submitAsyncTask(asyncTask)
> }
> {code}
> which is why I suspect suspendContinuationIfNeeded() should be called before
> JAXRSInvoker invokes the JAXRS method.
> One of the things that made this really difficult to track down was that
> AsyncResponseImpl.resume() returns true even if the Continuation was not
> resumed! If you make it into doResumeFinal(), like was happening in my case,
> the return is always true even if cont.resume() is not called. So from user
> code, it looks like everything is ok, but the response never gets sent to the
> client.
> This seems somewhat related to the problems reported in CXF-7037
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)