Spring Servlet3 扩展模块笔记

6 篇文章 0 订阅
3 篇文章 0 订阅

Servlet 3.0

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的注入等
  • 异步处理的入口类
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值