我有一个控制器,它接收检查游戏状态的请求,我希望整个事情是异步完成的。控制器似乎是异步工作,但是当我发布请求时邮递员会挂起。
这是我的控制器:
@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
。
答案 0 :(得分:2)
这是预期的行为。返回的Callable在一个单独的线程池中执行,请求线程可以自由进行另一次处理。但是,与该特定客户端的连接将是打开的,只有在可调用完成后才会响应客户端。如果在预期时间内未获得响应,客户端将等待响应或超时。
以上型号仅适用于服务器端负载处理而非客户端。所以这个模型不适合你。
如果您希望客户端返回,那么您应该返回一个jobid作为返回值。为该客户端提供一个poll url来检查响应。作业完成后,返回响应。