首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Spring3.2 Http 请求处理历程笔记

2012-12-24 
Spring3.2 Http 请求处理过程笔记Spring3.2请求处理大致过程处理过程初始化:DispatcherServlet.onRefresh(

Spring3.2 Http 请求处理过程笔记

Spring3.2请求处理大致过程

处理过程
  • 初始化:

    • 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()

    代码详述

    DispatcherServlet.java

    在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);            }        }

热点排行