异步解决
在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多平台公布