繁体   English   中英

Spring中的异步控制器和方法

[英]Asynchronous controller and method in Spring

我有一个控制器,该控制器接收检查游戏状态的请求,我希望整个过程异步完成。 控制器似乎正在异步工作,但是当我执行发布请求时,邮递员挂起了。

这是我的控制器:

@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

这是预期的行为。 返回的Callable在单独的线程池中执行,而请求线程可用于其他处理。 但是,将打开到该特定客户端的连接,并且仅在可调用完成之后才响应该客户端。 客户端将等待响应,或者如果未在预期时间内获得响应,则会超时。

上面的模型仅适用于服务器端的负载处理,不适用于客户端。 因此,该模型不适用于您。

如果希望客户端返回,则应返回Jobid作为返回值。 为该客户端提供一个轮询URL,以检查响应。 作业完成后,返回响应。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM