Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Synchronous Jersey Rest service that initiates a background task?

This is the issue I encounter, which is design and implementation related :

I have a REST web service that accepts POST requests. Nothing special about it. It currently responds synchronously.

However, this web service is going to initiate a background process that may take some long time.

I do not want this service to respond 30 minutes later.

Instead, it should immediately return an ack response to the client, and nothing more (even after 30 minutes, there will be no more information to send).

How do I implement such behavior with Jersey ?

I read the page https://jersey.java.net/nonav/documentation/2.0/async.html#d0e6914.

Though it was an interesting reading, I did not find the way to only send an ACK typed response (something like an HTTP 200 code).

Maybe i am confused with asynchronous and the behavior I want to implement.

I just understood that I could create a new Thread within my @POST method to handle the background process, and just returns immediately the ACK response.

But does this newly thread live after the response has been sent back to the client ?

How would you implement this WS ?

I hope you will help me clarifying this point.

like image 554
jeromedt Avatar asked Jul 09 '13 17:07

jeromedt


1 Answers

I think the Jersey 2 Asynchronous Server API you linked would still hold the client connection until the processing completes. The asynchronous processing is really internal to Jersey and does not affect the client experience.

If you want to return an ACK, you can use a regular Jersey method, delegate the work to another thread and then return immediately. I'd recommend HTTP 202 for this use case.

You may create a Thread to do so just like in the Jersey 2 example and it would survive the execution of the Jersey resource method invocation:

@POST
public Response asyncPost(String data) {
    new Thread(...).start();
    return Response.status(Response.Status.ACCEPTED).build();
}

This being said, creating threads is generally not recommended within app servers.

If you're using EE7, I'd recommend you look at JSR-236 http://docs.oracle.com/javaee/7/api/javax/enterprise/concurrent/package-summary.html

If you're using EE6, you can consider sending a message to a queue to be processed by a Message-Driven Beans (MDB) in the background.

like image 112
TheArchitect Avatar answered Sep 20 '22 12:09

TheArchitect