我试图从一个链接中了解异步控制器的实现:
http://shengwangi.blogspot.in/2015/09/asynchronous-spring-mvc-hello-world.html
我对控制线程收到请求并存在这一点感到困惑。然后服务方法收到进一步处理的请求。
@RequestMapping("/helloAsync")
public Callable<String> sayHelloAsync() {
logger.info("Entering controller");
Callable<String> asyncTask = new Callable<String>() {
@Override
public String call() throws Exception {
return helloService.doSlowWork();
}
};
logger.info("Leaving controller");
return asyncTask;
}
因为,Controller存在它并将控制传递给适当的处理程序映射/ jsp。浏览器会在用户身上看到什么?
答案 0 :(得分:1)
浏览器等待响应处理它。
异步过程仅在服务器端进行,与浏览器无关。浏览器发送请求并等待服务器写回响应。
由于您返回Callable并不意味着控制器存在流。 Spring的响应处理程序将等待异步任务执行以写回响应。
请通过AsyncHandlerMethodReturnValueHandler来处理从控制器返回的异步响应。
如果你返回callable,那么它将由CallableHandlerMethodReturnvaluehandler处理:
public void handleReturnValue(Object returnValue, MethodParameter returnType,
ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
if (returnValue == null) {
mavContainer.setRequestHandled(true);
return;
}
Callable<?> callable = (Callable<?>) returnValue;
WebAsyncUtils.getAsyncManager(webRequest).startCallableProcessing(callable, mavContainer);
}
答案 1 :(得分:1)
我从这个链接中清除了我的怀疑:
https://dzone.com/articles/jax-rs-20-asynchronous-server-and-client
但是,他们使用不同的方式来完成异步处理,但每个方法的核心概念应该是相同的。
文章的一些重要部分:
异步处理模型背后的想法是分开 连接接受和请求处理操作。技术上 说它意味着分配两个不同的线程,一个接受 客户端连接和另一个处理繁重和耗时 操作。在这个模型中,容器调度一个线程来接受 客户端连接(acceptor),将请求移交给处理 (工人)线程并释放一个接受器。结果将被发回 工作线程给客户端。在这个机制客户端 连接仍然开放。这样可能不会对性能产生太大影响 处理模型对服务器的 THROUGHPUT 和 SCALABILITY 产生了很大的影响。