Spring Servlet3 扩展模块笔记
接口
/** * {@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);//设置异步处理已经完成 }