[英]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.