[
https://issues.apache.org/jira/browse/CXF-6389?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14531889#comment-14531889
]
Wei Zhang commented on CXF-6389:
--------------------------------
Sergey,
If resume() and isSuspened() are called in a single request, the code works
well, since initialSuspend is false. But in this test code, resume() and
isSuspened() are called in two requests. In the second request (isSuspended()),
asyncImpl.prepareContinuation()>asyncImpl.initContinuation() was called, and
initialSuspened is set to true again, so the isSuspened() method will return
true regardless of the return value of cont.isPending().
> set initialSuspend=true incorrectly when resume the asyncresponse
> -----------------------------------------------------------------
>
> Key: CXF-6389
> URL: https://issues.apache.org/jira/browse/CXF-6389
> Project: CXF
> Issue Type: Bug
> Components: JAX-RS
> Affects Versions: 3.0.0, 3.0.3, 2.7.15
> Reporter: iris ding
>
> My Resource class:
> @Path("resource")
> public class Resource
> {
> public static final String RESUMED = "Response resumed";
> public static final String FALSE = "A method returned false";
> public static final String TRUE = "A method return true";
> //
> private static final AsyncResponseBlockingQueue[] stage = {
> new AsyncResponseBlockingQueue(1),
> new AsyncResponseBlockingQueue(1),
> new AsyncResponseBlockingQueue(1)};
> @GET
> @Path("suspend")
> public void suspend(@Suspended AsyncResponse asyncResponse)
> {
> stage[0].add(asyncResponse);
> }
>
> @GET
> @Path("cancelvoid")
> public String cancel(@QueryParam("stage") String stage)
> {
> AsyncResponse response = takeAsyncResponse(stage);
> boolean ret = response.cancel();
> System.out.println("*** response.cancel() 1 " + ret);
> ret &= response.cancel();
> System.out.println("*** response.cancel() 2 " + ret);
> addResponse(response, stage);
> return ret ? TRUE : FALSE;
> }
>
> @POST
> @Path("resume")
> public String resume(@QueryParam("stage") String stage, String response)
> {
> AsyncResponse async = takeAsyncResponse(stage);
> boolean b = resume(async, response);
> addResponse(async, stage);
> return b ? TRUE : FALSE;
> }
>
> protected static AsyncResponse takeAsyncResponse(String stageId)
> {
> return takeAsyncResponse(Integer.parseInt(stageId));
> }
> protected static AsyncResponse takeAsyncResponse(int stageId)
> {
> final ResponseBuilder error = createErrorResponseBuilder();
> AsyncResponse asyncResponse = null;
> try
> {
> asyncResponse = stage[stageId].take();
> }
> catch (InterruptedException e)
> {
> throw new WebApplicationException(error.entity(
> "ArrayBlockingQueue#take").build());
> }
> return asyncResponse;
> }
> protected static final void addResponse(AsyncResponse response, String
> stageId)
> {
> int id = Integer.parseInt(stageId) + 1;
> if (id != stage.length)
> stage[id].add(response);
> }
> protected static boolean resume(AsyncResponse takenResponse, Object
> response)
> {
> return takenResponse.resume(response);
> }
> protected static ResponseBuilder createErrorResponseBuilder()
> {
> return Response.status(Status.EXPECTATION_FAILED);
> }
> }
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)