secret
secret

Reputation: 786

Asynchronous controller and method in Spring

I have a controller which receives a request to check status of a game, I want the whole thing to be done asynchronously. The controller seems to be working asynchronous, however postman hangs when I do the post request.

Here is my controller:

@RequestMapping(value = "/status", method = RequestMethod.POST, consumes="application/json")
private Callable<Byte> getStatus(@RequestBody final Matrix board){
    System.out.println("Entering  controller");
    Callable<Byte> asyncResult = new Callable<Byte>() {
        @Override
        public Byte call() throws Exception {
            return status.checkWinner(board);
        }
    };


    System.out.println("Leaving  controller");
    return asyncResult ;

}

and here is my method in Status class:

public Byte checkWinner(Matrix board) {

    System.out.println("start Slow work");
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("finish Slow work");
    return 0;
}

the program output shows this:

Entering controller

Leaving controller

start Slow work

finish Slow work

So i tried to put @Async on top of checkWinner method, postman shows 200 status ok, without showing the result 0 later on. And without the @Async annotation, postman (webpage) freezes for 5 seconds and the result 0 is shown.

Upvotes: 1

Views: 531

Answers (1)

Srikanth
Srikanth

Reputation: 1025

This is an expected behaviour. The Callable returned is executed in a separate thread pool and the request thread is free for another processing. However, the connection to that specific client will be open and the client will be responded to only after callable is complete. Client will wait for the response or will timeout if the response is not obtained in the expected time.

The above model is only for server side load handling not client side. So this model will not work for you.

If you want the client to return, then you should return a jobid as the return value. Provide that client with a poll url to check for response. When the job is complete, return the response.

Upvotes: 2

Related Questions