Spring中的异步控制器和方法

时间:2016-09-11 15:09:51

标签: java spring asynchronous spring-boot

我有一个控制器,它接收检查游戏状态的请求,我希望整个事情是异步完成的。控制器似乎是异步工作,但是当我发布请求时邮递员会挂起。

这是我的控制器:

@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 ;

}

这是我在Status类中的方法:

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;
}

程序输出显示:

输入控制器

离开控制器

开始慢工作

完成慢工作

所以我尝试将@Async置于checkWinner方法之上,邮递员显示200 status ok,之后不显示结果0。如果没有@Async注释,邮递员(网页)将冻结5秒钟,并显示结果0

1 个答案:

答案 0 :(得分:2)

这是预期的行为。返回的Callable在一个单独的线程池中执行,请求线程可以自由进行另一次处理。但是,与该特定客户端的连接将是打开的,只有在可调用完成后才会响应客户端。如果在预期时间内未获得响应,客户端将等待响应或超时。

以上型号仅适用于服务器端负载处理而非客户端。所以这个模型不适合你。

如果您希望客户端返回,那么您应该返回一个jobid作为返回值。为该客户端提供一个poll url来检查响应。作业完成后,返回响应。