Spring3.2 Http 请求处理过程笔记
初始化:
- DispatcherServlet.onRefresh()
- DispatcherServlet.initStrategies()
- DispatcherServlet.initHandlerMappings()
处理请求:
- DispatcherServlet.doDispatch()
- RequestMappingHandlerAdapter.handle()
- RequestMappingHandlerAdapter.handleInternal()
- RequestMappingHandlerAdapter.invokeHandleMethod()
- WebAsyncManager.setTaskExecutor()
- WebAsyncManager.setAsyncWebRequest()
- WebAsyncManager.registerCallableInterceptors()
- WebAsyncManager.registerDeferredResultInterceptors()
- ServletInvocableHandlerMethod.invokeAndHandle()
- CallableMethodReturnValueHandler/DeferredResultMethodReturnValueHandler.handleReturnValue()
- WebAsyncManager.startCallableProcessing()/WebAsyncManager.startDeferredResultProcessing()
在onRefresh时,初始化
/** * Start concurrent request processing and initialize the given * {@link DeferredResult} with a {@link DeferredResultHandler} that saves * the result and dispatches the request to resume processing of that * result. The {@code AsyncWebRequest} is also updated with a completion * handler that expires the {@code DeferredResult} and a timeout handler * assuming the {@code DeferredResult} has a default timeout result. * * @param deferredResult the DeferredResult instance to initialize * @param processingContext additional context to save that can be accessed * via {@link #getConcurrentResultContext()} * @throws Exception If concurrent processing failed to start * * @see #getConcurrentResult() * @see #getConcurrentResultContext() */ public void startDeferredResultProcessing( final DeferredResult<?> deferredResult, Object... processingContext) throws Exception { Assert.notNull(deferredResult, "DeferredResult must not be null"); Assert.state(this.asyncWebRequest != null, "AsyncWebRequest must not be null"); Long timeout = deferredResult.getTimeoutValue(); if (timeout != null) { this.asyncWebRequest.setTimeout(timeout); } List<DeferredResultProcessingInterceptor> interceptors = new ArrayList<DeferredResultProcessingInterceptor>(); interceptors.add(deferredResult.getInterceptor()); interceptors.addAll(this.deferredResultInterceptors.values()); interceptors.add(timeoutDeferredResultInterceptor); final DeferredResultInterceptorChain interceptorChain = new DeferredResultInterceptorChain(interceptors); this.asyncWebRequest.addTimeoutHandler(new Runnable() { public void run() { try { interceptorChain.triggerAfterTimeout(asyncWebRequest, deferredResult); } catch (Throwable t) { setConcurrentResultAndDispatch(t); } } }); this.asyncWebRequest.addCompletionHandler(new Runnable() { public void run() { interceptorChain.triggerAfterCompletion(asyncWebRequest, deferredResult); } }); interceptorChain.applyBeforeConcurrentHandling(asyncWebRequest, deferredResult); startAsyncProcessing(processingContext); try { interceptorChain.applyPreProcess(this.asyncWebRequest, deferredResult); deferredResult.setResultHandler(new DeferredResultHandler() { public void handleResult(Object result) { result = interceptorChain.applyPostProcess(asyncWebRequest, deferredResult, result); setConcurrentResultAndDispatch(result); } }); } catch (Throwable t) { setConcurrentResultAndDispatch(t); } }