Spring mvc 异步控制器springmvc中的请求流
我试图从以下链接之一了解异步控制器的实现: 我对控制器线程收到请求并存在这一点感到困惑。然后服务方法接收到进一步处理的请求Spring mvc 异步控制器springmvc中的请求流,spring-mvc,asynchronous,Spring Mvc,Asynchronous,我试图从以下链接之一了解异步控制器的实现: 我对控制器线程收到请求并存在这一点感到困惑。然后服务方法接收到进一步处理的请求 @RequestMapping("/helloAsync") public Callable<String> sayHelloAsync() { logger.info("Entering controller"); Callable<String> asyncTask = new Callable<String>
@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;
}
@RequestMapping(“/helloAsync”)
公共可调用sayHelloAsync(){
logger.info(“进入控制器”);
Callable asyncTask=new Callable(){
@凌驾
公共字符串调用()引发异常{
返回helloService.doSlowWork();
}
};
logger.info(“离开控制器”);
返回异步任务;
}
因为,控制器存在它,并将控件传递给适当的处理程序mapping/jsp。用户将在浏览器上看到什么?浏览器等待响应处理它 异步进程只在服务器端发生,与浏览器无关。浏览器发送请求并等待服务器写回响应 因为返回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);
}
public void handleReturnValue(对象返回值、方法参数返回类型、,
ModelAndViewContainer mavContainer,NativeWebRequest(webRequest)引发异常{
if(returnValue==null){
mavContainer.setRequestHandled(true);
返回;
}
Callable Callable=(Callable)returnValue;
getAsyncManager(webRequest).startCallableProcessing(可调用,mavContainer);
}
浏览器等待响应来处理它
异步进程只在服务器端发生,与浏览器无关。浏览器发送请求并等待服务器写回响应
因为返回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);
}
public void handleReturnValue(对象返回值、方法参数返回类型、,
ModelAndViewContainer mavContainer,NativeWebRequest(webRequest)引发异常{
if(returnValue==null){
mavContainer.setRequestHandled(true);
返回;
}
Callable Callable=(Callable)returnValue;
getAsyncManager(webRequest).startCallableProcessing(可调用,mavContainer);
}
我已清除了此链接中的疑问:
然而,他们使用不同的方法来完成异步处理,但是每个方法的核心概念应该是相同的
文章的一些重要部分:
异步处理模型背后的思想是分离
连接接受和请求处理操作。从技术上讲
这意味着分配两个不同的线程,一个线程接受
客户端连接和其他连接需要处理繁重且耗时的数据
操作。在这个模型中,容器分派了一个线程来接受
客户端连接(接受者),将请求移交给处理
(工作者)线程并释放接受者。结果将被发回
通过工作线程发送到客户端。在这个机制中,客户端的
连接保持打开状态。可能对性能影响不大,例如
处理模型对服务器的吞吐量和可伸缩性影响很大
我已清除了此链接中的疑问: 然而,他们使用不同的方法来完成异步处理,但是每个方法的核心概念应该是相同的 文章的一些重要部分: 异步处理模型背后的思想是分离 连接接受和请求处理操作。从技术上讲 这意味着分配两个不同的线程,一个线程接受 客户端连接和其他连接需要处理繁重且耗时的数据 操作。在这个模型中,容器分派了一个线程来接受 客户端连接(接受者),将请求移交给处理 (工作者)线程并释放接受者。结果将被发回 通过工作线程发送到客户端。在这个机制中,客户端的 连接保持打开状态。可能对性能影响不大,例如 处理模型对服务器的吞吐量和可伸缩性影响很大
你能提供一些链接来证明你的答案吗?我在谷歌上搜索了一下,但找不到相关的答案。谢谢你的回答。你能通过这个方法CallableMethodReturnValueHandler并尝试调试和更新答案吗?你能提供一些链接来证明你的答案吗?我在谷歌上搜索了一下,但找不到相关的答案。谢谢你的回答。你能通过这个方法CallableMethodReturnValueHandler并尝试调试并更新答案吗