Spring WebMVC 请求处理细节
2021-09-19 15:40:42 1 举报
Spring WebMVC 请求处理的流程分析及其异步请求处理
作者其他创作
大纲/内容
AsyncContextImpl
2.2. this.configurers.configureMessageConverters(converters);
1. doDispatch()
HandlerMethodArgumentResolverComposite
invokeHandlerMethod()
进入子类实现resolveArgument()
ServletInvocableHandlerMethod
2.1. configureMessageConverters
18. this.asyncWebRequest.startAsync()
7.2. 进入子类实现handleInternal()
21. new AsyncContextImpl()
7.1. handle()
hook.action()
11. getMethodArgumentValues()
AbstractMessageConverterMethodArgumentResolver
33. 重新分发异步请求,相当于使用同一个 Request 对象再走一遍请求处理流程
25. this.asyncContext.addListener(this)
DeferredResultHandler
ConcurrentResultHandlerMethod
handleInternal() 子类实现
2. WebAsyncUtils.getAsyncManager()
30. resultHandlerToUse.handleResult()
13. selectHandler()
11.1. resolvers.supportsParameter()
16.1 deferredResult.getTimeoutValue()
29. deferredResult.setResult()
38. invocableMethod.invokeAndHandle()
1. Tomcat 不断轮询 socket,当轮询到可读写的 socket 时会创建 SocketProcessorBase 异步任务扔到线程池中执行 socket 读写任务。这个过程中会调用到 AbstractProcessor 子类实现,如果发现是异步请求,则将这个 Processor 添加到等待队列中2. Tomcat 服务器启动时会开启一个周期线程池,处理等待队列中的 Processor,检查其是否超时。超时则处理 Socket 超时事件,最终通过 CoyoteAdapter 适配器将超时回调到上层
24.asyncStateMachine.asyncStart()
所有实现 WebMvcConfigurer 接口的实例的配置方法都会被调用,从而将自定义的配置添加到配置列表中
WebAsyncUtils
DelegatingWebMvcConfiguration
周期线程池触发 Processor#timeoutAsync()
DeferredResultMethodReturnValueHandler
hook.action()
20. startAsync()
WebMvcConfigurationSupport
6. adapter.supports(handler)
RequestMappingHandlerAdapter 对象创建后,会在 afterPropertiesSet() 方法中设置默认的参数解析器(getDefaultArgumentResolvers方法),需关注RequestResponseBodyMethodProcessor 解析器,其中包含转化器列表,关系为 1:n
AbstractProcessor
1. requestMappingHandlerAdapter()
10. invocableMethod.invokeAndHandle()
26. this.asyncContext.setTimeout()
39. invokeForRequest()
16. doInvoke(args)
DispatcherSerlvet
7.1 new StandardServletAsyncWebRequest()
实例化组件
16.2 deferredResult.getInterceptor()
RequestMappingHandlerAdapter
4. ha.handle()
12. resolver.resolveArgument()
11.2 getArgumentResolver()
2.3. configureMessageConverters()
37. invocableMethod.wrapConcurrentResult()
11. invokeForRequest()
14.调用祖父类 readWithMessageConverters()
9.asyncManager.setAsyncWebRequest()
setAsyncTimeout()
DeferredResult
此处进入 Tomcat 服务器处理
36. asyncManager.hasConcurrentResult()
WebMvcConfigurer
StandardServletAsyncWebRequest
2. getMessageConverterss()
37. 将原本的请求处理方法替换掉38. 反射执行替换后的处理方法39. 直接将异步请求 DeferredResult 的结果作为返回值,后续流程与普通请求的处理一致
4.doDispatch()
17. returnValueHandlers.handleReturnValue()
3. adapter.setMessageConverters(getMessageConverters());
6. createInvocableHandlerMethod()
遍历转换器列表,根据转换器的 canRead()方法选择合适的转换器,所有转换器都是 HttpMessageConverter的子类
33. this.asyncContext.dispatch()
10. 进入父类实现invokeForRequest()
13. readWithMessageConverters()
17. startAsyncProcessing()
HandlerMethodArgumentResolver
AbstractHandlerMethodAdapter
请求异步处理其实就是框架内部根据方法返回值先将请求挂起,不响应,在条件满足后再次分发这个请求进行处理响应,也就是一个请求对象会使用多次,故需使用同一个 WebAsyncManager 对象
关键代码,使用转换器来转换请求参数
27. request.getCoyoteRequest().action()
32. this.asyncWebRequest.dispatch()
12. returnValueHandlers.handleReturnValue()
实例化RequestMappingHandlerAdapter 的时候会将自定义的配置也设置进 adapter
HttpMessageConverter
14.handler.handleReturnValue()
8. WebAsyncUtils.getAsyncManager()
16.1.1 this.asyncWebRequest.setTimeout()
35. 重新分发,省略部分流程
AsyncStateMachine
InvocableHandlerMethod
connector/Request
6.1. 进入子类实现supports()
返回值处理器处理返回值
创建 ServletInvocableHandlerMethod 对象invocableMethod,并将 RequestMappingHandlerAdapter 中的参数解析器和返回值解析器设置进去
doTimeoutAsync()
8. invokeHandlerMethod()
22.setStarted(()
28. deferredResult.setResultHandler()
返回经过解析器处理的参数
HandlerAdapter
23. 将 AsyncContextImpl 作为监听器注册,当异步请求完成时回调 AsyncContextImpl#fireOnComplete() 方法,最终回调上层 DeferrdResult 的完成时方法
WebAsyncManager
23. this.request.getCoyoteRequest().action()
获取invokeForRequest()方法返回值
RequestResponseBodyMethodProcessor
5. invokeHandlerMethod()
3. new WebAsyncManager()
根据 HandlerAdapter支持的类型选择 HandlerAdapter
11.3. this.resolvers.resolveArgument()
setResultInternal()
34. doDispatch()
15. WebAsyncUtils.getAsyncManager(webRequest).startDeferredResultProcessing()
31. setConcurrentResultAndDispatch()
19. getRequest().startAsync()
new ConcurrentResultHandlerMethod()
5. HandlerAdapter ha = getHandlerAdapter()
HandlerMethodReturnValueHandlerComposite
coyote/Request
16.2.1 asyncWebRequest.addTimeoutHandler()
7. WebAsyncUtils.createAsyncWebRequest()
通过聚合类遍历参数解析器列表,执行其 supportsParameter()方法判断是否可解析
该步骤为请求处理的枢纽,负责请求执行及返回
0 条评论
下一页