异步解决

在Servlet3.0版本中引入了异步解决的性能,使线程能够返回到容器,从而执行更多的工作

应用AysncContext来进行异步操作

public interface ServletRequest {    // 应用原始申请和响应对象用于异步解决    public AsyncContext startAsync() throws IllegalStateException;     // 将申请转换为异步模式,并应用给定的申请和响应对象初始化,能够应用ServletRequestWrapper和ServletResponseWrapper    public AsyncContext startAsync(ServletRequest servletRequest,                                   ServletResponse servletResponse)            throws IllegalStateException;       // 检测申请是否为异步模式,应用原始申请和响应对象进行解决    public boolean isAsyncStarted();    // 是否反对异步解决    public boolean isAsyncSupported();    // 返回由startAsync调用创立的AsyncContext    public AsyncContext getAsyncContext();}public interface AsyncContext {    // AsyncContext中的申请响应进行分派    void dispatch();    // 分派到指定资源    void dispatch(String path);    // 分派到指定资源    void dispatch(ServletContext context, String path);        // 实现异步操作,并完结与这个异步上下文的关联的响应,在异步上下文中写入响应对象之后调用该办法    void complete();        // 容器提供了一个不同的线程,在该线程中解决阻塞操作    void start(Runnable run);        // 注册监听器用于接管 onTimeout、onError(用于告诉监听器在Servlet上启动的异步操作未能实现)、onComplete(用于告诉监听器在Servlet上启动的异步操作实现了)、onStartAsync(用于告诉监听器正在通过调用一个ServletRequest.startAsync办法启动一个新的异步周期)告诉    void addListener(AsyncListener listener);    void addListener(AsyncListener listener, ServletRequest request,            ServletResponse response);}
要在servlet上启用异步解决,须要配置asyncSupported为true

<!-- more -->

以tomcat为例,看一下异步是怎么解决的

@Overridepublic AsyncContext startAsync() {    return startAsync(getRequest(),response.getResponse());}@Overridepublic AsyncContext startAsync(ServletRequest request,        ServletResponse response) {  // 先判断asyncSupported是否为ture    if (!isAsyncSupported()) {        IllegalStateException ise =                new IllegalStateException(sm.getString("request.asyncNotSupported"));        log.warn(sm.getString("coyoteRequest.noAsync",                StringUtils.join(getNonAsyncClassNames())), ise);        throw ise;    }    if (asyncContext == null) {        asyncContext = new AsyncContextImpl(this);    }    asyncContext.setStarted(getContext(), request, response,            request==getRequest() && response==getResponse().getResponse());    asyncContext.setTimeout(getConnector().getAsyncTimeout());    return asyncContext;}
https://zhhll.icu/2021/javaweb/根底/12.异步解决/

本文由mdnice多平台公布