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
DeferredResultProcessingInterceptor.java
- DeferredResult处理过程拦截器
- 在start async前,超时后/异步处理完成后/网络超时后触发拦截
DeferredResultProcessingInterceptorAdapter.java
- 抽象类实现DeferredResultProcessingInterceptor,做空实现
DeferredResultInterceptorChain.java
- 调用DeferredResultProcessingInterceptor的辅助类
DeferredResult.java
- 递延结果,在两个线程中传递的对象结果
- 实现Comparable接口以保证加入PriorityQueue队列的正确顺序
CallableProcessingInterceptor.java
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的注入等
- 异步处理的入口类