• Spring Servlet3 扩展模块笔记


    AsyncWebRequest.java

    • 异步请求接口,继承NativeWebRequest

    接口

      /**
             * Set the time required for concurrent handling to complete.
             * This property should not be set when concurrent handling is in progress,
             * i.e. when {@link #isAsyncStarted()} is {@code true}.
             * @param timeout amount of time in milliseconds; {@code null} means no
             *  timeout, i.e. rely on the default timeout of the container.
             */
            //设置超时时间
            void setTimeout(Long timeout);
    
            /**
             * Add a handler to invoke when concurrent handling has timed out.
             */
            //增加超时处理类
            void addTimeoutHandler(Runnable runnable);
    
            /**
             * Add a handle to invoke when request processing completes.
             */
            //增加请求处理完成处理类
            void addCompletionHandler(Runnable runnable);
    
            /**
             * Mark the start of asynchronous request processing so that when the main
             * processing thread exits, the response remains open for further processing
             * in another thread.
             * @throws IllegalStateException if async processing has completed or is not supported
             */
            //标示异步请求开始,返回异步Context
            void startAsync();
    
            /**
             * Whether the request is in async mode following a call to {@link #startAsync()}.
             * Returns "false" if asynchronous processing never started, has completed,
             * or the request was dispatched for further processing.
             */
            //判断是否是当前线程是否启动异步模式,false表示没有启动异步模式,或者已经完成,否则请求被分发到其他线程处理
            boolean isAsyncStarted();
    
            /**
             * Dispatch the request to the container in order to resume processing after
             * concurrent execution in an application thread.
             */
            //分发请求到容器,唤醒其他线程处理
            void dispatch();
    
            /**
             * Whether asynchronous processing has completed.
             */
            //判断异步处理是否完成
            boolean isAsyncComplete();
    

      

    StandardServletAsyncWebRequest.java

    • 继承ServletWebRequest,实现AsyncWebRequest, AsyncListener,一个标准异步web请求的实现类。

    代码

     /**
          * {@inheritDoc}
          * <p>In Servlet 3 async processing, the timeout period begins after the
          * container processing thread has exited.
          */
         public void setTimeout(Long timeout) {
             Assert.state(!isAsyncStarted(), "Cannot change the timeout with concurrent handling in progress");//断言状态没有启动异步
             this.timeout = timeout;
         }
    
         public boolean isAsyncStarted() {
             return ((this.asyncContext != null) && getRequest().isAsyncStarted());//异步状态不为空,请求是否启动异步处理模式,如果请求被AsyncContext.dispatch()到容器,或 AsynContext.complete ,则返回false.
    
    
         }
    
         /**
          * Whether async request processing has completed.
          * <p>It is important to avoid use of request and response objects after async
          * processing has completed. Servlet containers often re-use them.
          */
         public boolean isAsyncComplete() {
             return this.asyncCompleted.get();//请求的异步处理是否完成
         }
    
         public void startAsync() {
             Assert.state(getRequest().isAsyncSupported(),
                     "Async support must be enabled on a servlet and for all filters involved " +
                     "in async request processing. This is done in Java code using the Servlet API " +
                     "or by adding \"<async-supported>true</async-supported>\" to servlet and " +
                     "filter declarations in
                    web.xml.");//判断请求是否支持异步处理
             Assert.state(!isAsyncComplete(), "Async processing has already completed");
             if (isAsyncStarted()) {//判断状态是否已经启动异步处理模式
                 return;
             }
             this.asyncContext = getRequest().startAsync(getRequest(), getResponse());
             this.asyncContext.addListener(this);
             if (this.timeout != null) {
                 this.asyncContext.setTimeout(this.timeout);
             }
         }
    
         public void dispatch() {
             Assert.notNull(this.asyncContext, "Cannot dispatch without an AsyncContext");
             this.asyncContext.dispatch();
         }
    
         // ---------------------------------------------------------------------
         // Implementation of AsyncListener methods
         // ---------------------------------------------------------------------
    
         public void onStartAsync(AsyncEvent event) throws IOException {
         }
    
         public void onError(AsyncEvent event) throws IOException {
         }
    
         public void onTimeout(AsyncEvent event) throws IOException {
             for (Runnable handler : this.timeoutHandlers) {
                 handler.run();
             }
         }
    
         public void onComplete(AsyncEvent event) throws IOException {
             for (Runnable handler : this.completionHandlers) {
                 handler.run();
             }
             this.asyncContext = null;
             this.asyncCompleted.set(true);//设置异步处理已经完成
         }
    

      

    NoSupportAsyncWebRequest.java

    • 不支持异步处理模式的web请求

    DeferredResultProcessingInterceptor.java

    • DeferredResult处理过程拦截器
    • 在start async前,超时后/异步处理完成后/网络超时后触发拦截

    DeferredResultProcessingInterceptorAdapter.java

    • 抽象类实现DeferredResultProcessingInterceptor,做空实现

    DeferredResultInterceptorChain.java

    • 调用DeferredResultProcessingInterceptor的辅助类

    DeferredResult.java

    • 递延结果,在两个线程中传递的对象结果
    • 实现Comparable接口以保证加入PriorityQueue队列的正确顺序

    CallableProcessingInterceptor.java

    • Callable拦截器

    CallableProcessingInterceptorAdapter.java

    • 抽象类实现CallableProcessingInterceptor接口,空实现

    CallableInterceptorChain.java

    • 调用CallableProcessingInterceptor的辅助类

    TimeoutCallableProcessingInterceptor.java

    • 继承CallableProcessingInterceptorAdapter
    • 实现超时处理方法

    TimeoutDeferredResultProcessingInterceptor.java

    • 继承DeferredResultProcessingInterceptorAdapter
    • 实现超时处理方法

    WebAsyncTask.java

    • web异步任务
    • 包含一个Callable类,一个超时时间,一个任务执行着或名字

    WebAsyncUtils.java

    • 实现getAsyncManager
    • 实现createAsyncWebRequest

    WebAsyncManager.java

    • 对Callables和DeferredResults启动的管理,包括拦截器的注入,Excutor的注入等
    • 异步处理的入口类
  • 相关阅读:
    C#中的代理(Delegate)
    动态栈C语言
    AMS算法
    动态队列实现C语言
    带头结点的循环单链表C语言
    静态栈C语言
    不带头结点的单链表C语言实现
    带头结点的双向循环链表C语言
    带头节点的单链表C语言实现
    使用函数指针模拟C++多态
  • 原文地址:https://www.cnblogs.com/yangjun1120/p/2827368.html
Copyright © 2020-2023  润新知