Java Spring异步控制器及其实现方法
我有一个控制器,它接收检查游戏状态的请求,我希望整个过程都是异步完成的。控制器似乎是异步工作的,但是当我执行post请求时,postman挂起 这是我的控制器:Java Spring异步控制器及其实现方法,java,spring,asynchronous,spring-boot,Java,Spring,Asynchronous,Spring Boot,我有一个控制器,它接收检查游戏状态的请求,我希望整个过程都是异步完成的。控制器似乎是异步工作的,但是当我执行post请求时,postman挂起 这是我的控制器: @RequestMapping(value = "/status", method = RequestMethod.POST, consumes="application/json") private Callable<Byte> getStatus(@RequestBody final Matrix board){
@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 ;
}
程序输出显示如下:
进入控制器
离开控制器
开始缓慢的工作
慢条斯理
所以我试着把
@Async
放在checkWinner
方法的顶部,邮差显示200状态ok
,而不显示结果0
。如果没有@Async
注释,邮递员(网页)将冻结5秒钟,并显示结果0
这是一种预期行为。返回的可调用线程在单独的线程池中执行,请求线程可以自由地进行其他处理。但是,与该特定客户端的连接将被打开,并且只有在callable完成后才会响应该客户端。客户端将等待响应,如果在预期时间内未获得响应,则客户端将超时
上述模型仅用于服务器端负载处理,而不是客户端。所以这个模型不适合你
如果希望客户端返回,则应返回jobid作为返回值。为该客户端提供轮询url以检查响应。作业完成后,返回响应。那么您希望得到什么?
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;
}