Question on @Suspended AsyncResponse

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Question on @Suspended AsyncResponse

Paul Carter-Brown-3
Hi,

In this code sample, why is it that it takes 3s for the "OK" response to
get back to the client.
My expectation would be that the response would go back immediately?

@Path("/abc")
@Stateless
public class BasicResource {

    @PersistenceContext()
    private EntityManager em;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public void test(@Suspended final AsyncResponse asyncResponse) {
        // Want OK to get to the client immediately
        asyncResponse.resume("OK");
        try {
            // Some long running JDBC transactional stuff to run in JTA
container managed transaction using injected em
            // That must commit when done
            Thread.sleep(3000);
        } catch (Exception e) {
        }
    }
}

Paul
Reply | Threaded
Open this post in threaded view
|

Re: Question on @Suspended AsyncResponse

David Jencks-3
IIUC this method is running inside the container managed transaction?  Does it send the response immediately if it’s not in a container managed transaction?

david jencks

> On Oct 18, 2019, at 10:21 AM, Paul Carter-Brown <[hidden email]> wrote:
>
> Hi,
>
> In this code sample, why is it that it takes 3s for the "OK" response to
> get back to the client.
> My expectation would be that the response would go back immediately?
>
> @Path("/abc")
> @Stateless
> public class BasicResource {
>
>    @PersistenceContext()
>    private EntityManager em;
>
>    @GET
>    @Produces(MediaType.TEXT_PLAIN)
>    public void test(@Suspended final AsyncResponse asyncResponse) {
>        // Want OK to get to the client immediately
>        asyncResponse.resume("OK");
>        try {
>            // Some long running JDBC transactional stuff to run in JTA
> container managed transaction using injected em
>            // That must commit when done
>            Thread.sleep(3000);
>        } catch (Exception e) {
>        }
>    }
> }
>
> Paul

Reply | Threaded
Open this post in threaded view
|

Re: Question on @Suspended AsyncResponse

Paul Carter-Brown-3
Hi David,

Neither of these return immediately:

@Path("/abc")
@Stateless
@javax.ejb.TransactionAttribute(TransactionAttributeType.NEVER)
public class BasicResource {
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public void test(@Suspended final AsyncResponse asyncResponse) {
        asyncResponse.resume(Response.ok("Hello world").build());
        sleep();
    }
    private void sleep() {
        try {
            Thread.sleep(3000);
        } catch (Exception e) {
        }
    }
}

@Path("/abc")
public class BasicResource {
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public void test(@Suspended final AsyncResponse asyncResponse) {
        asyncResponse.resume(Response.ok("Hello world").build());
        sleep();
    }
    private void sleep() {
        try {
            Thread.sleep(3000);
        } catch (Exception e) {
        }
    }
}

Paul


On Sat, Oct 19, 2019 at 1:23 AM David Jencks <[hidden email]>
wrote:

> IIUC this method is running inside the container managed transaction?
> Does it send the response immediately if it’s not in a container managed
> transaction?
>
> david jencks
>
> > On Oct 18, 2019, at 10:21 AM, Paul Carter-Brown
> <[hidden email]> wrote:
> >
> > Hi,
> >
> > In this code sample, why is it that it takes 3s for the "OK" response to
> > get back to the client.
> > My expectation would be that the response would go back immediately?
> >
> > @Path("/abc")
> > @Stateless
> > public class BasicResource {
> >
> >    @PersistenceContext()
> >    private EntityManager em;
> >
> >    @GET
> >    @Produces(MediaType.TEXT_PLAIN)
> >    public void test(@Suspended final AsyncResponse asyncResponse) {
> >        // Want OK to get to the client immediately
> >        asyncResponse.resume("OK");
> >        try {
> >            // Some long running JDBC transactional stuff to run in JTA
> > container managed transaction using injected em
> >            // That must commit when done
> >            Thread.sleep(3000);
> >        } catch (Exception e) {
> >        }
> >    }
> > }
> >
> > Paul
>
>