当前位置:首页>开发>正文

手机提示servlet异步服务超时是什么意思 Tomcat中的Servlet异步是怎么实现的

2023-12-30 16:53:17 互联网 未知 开发

 手机提示servlet异步服务超时是什么意思 Tomcat中的Servlet异步是怎么实现的

手机提示servlet异步服务超时是什么意思

服务器异常,或网络延迟
手机提示servlet异步服务超时大部分是因为官方系统出现了问题,例如升级或正在修复漏洞,可以等到系统修复后就可以正常使用了,用户只要耐心等待即可。
另外如果手机网络有延迟的话也会出现这个提示,只要挪到信号强的地方就可以正常使用了。用servlet响应时间并不能加快,还是会取决于业务逻辑异步servlet请求后,依赖于业务的异步执行。

扩展资料:
servlet异步执行可以立即返回,Tomcat的线程可以立即回收,默认情况下,Tomcat的核心线程是10,最大线程数是200,能及时回收线程,也就意味着能处理更多的请求。
另外能够增加操作者的吞吐量,这也是异步Servlet的主要作用。代码主要核心逻辑就两部分,finalAsyncContextctx=req.startAsync()和ctx.complete()。
除此之外这个代码只是保存了一个异步上下文,同时设置一些基础信息,比如Timeout,如果设置的默认超时时间是30S,如果异步处理逻辑超过30S,此时执行就会抛出异常提示。

Tomcat中的Servlet异步是怎么实现的

有时Servlet在生成响应报文前必须等待某些耗时的操作,比如在等待一个可用的JDBC连接或等待一个远程Web服务的响应。对于这种情况servlet规范中定义了异步处理方式,由于Servlet中等待阻塞会导致Web容器整体的处理能力低下,所以对于比较耗时的操作可以放置到另外一个线程中进行处理,此过程保留连接的请求和响应对象,在处理完成之后可以把处理的结果通知到客户端。

下面先看Servlet在同步情况下的处理过程,如图所示,Tomcat的客户端请求由管道处理最后会通过Wrapper容器的管道,这时它会调Servlet实例的service方法进行逻辑处理,处理完后响应客户端,整个处理由Tomcat的Executor线程池的线程处理,而线程池的最大线程数使有限制的,所以这个处理过程越短、越快把线程让回线程池就越好。但如果Servlet中的处理逻辑耗时越长就会导致长期地占用Tomcat的处理线程池,影响Tomcat的整体处理能力。

为了解决上面的问题引入了支持异步的Servlet,同样是客户端请求到来,然后通过管道最后进入到Wrapper容器的管道,调用Servlet实例的service后,创建一个异步上下文将耗时的逻辑操作封装起来,交给用户自己定义的线程池,这时Tomcat的处理线程就能马上回到Executor线程池,而不用等待耗时的操作完成才让出线程,从而提升了Tomcat的整体处理能力。这里要注意的是,由于后面做完耗时的操作后还需要对客户端响应,所以需要保持住Request和Response对象,以便输出响应报文到客户端。

再结合一个简单的异步代码来看Tomcat对Servlet异步的实现:

public class AsyncServlet extends HttpServlet {

ScheduledThreadPoolExecutor userExecutor = new ScheduledThreadPoolExecutor(5)

public void doGet(HttpServletRequest req, HttpServletResponse res) {
AsyncContext aCtx = req.startAsync(req, res)
userExecutor.execute(new AsyncHandler(aCtx))
}

}

public class AsyncHandler implements Runnable {

private AsyncContext ctx

public AsyncHandler(AsyncContext ctx) {
this.ctx = ctx
}

@Override
public void run() {
//耗时操作
PrintWriter pw
try {
pw = ctx.getResponse().getWriter()
pw.print("done!")
pw.flush()
pw.close()
} catch (IOException e) {
e.printStackTrace()
}
ctx.complete()
}
}

我们创建一个AsyncServlet,它定义了一个userExecutor线程池专门用于处理该Servlet的所有请求的耗时的逻辑操作。这样就不会占用Tomcat内部的Executor线程池,影响到对其他Servlet的处理。这种思想有点像资源隔离,耗时的操作统一由指定的线程池处理,而不要影响其它耗时少的请求处理。

Servlet的异步的实现就很好理解了,startAsync方法其实就是创建了一个异步上下文AsyncContext对象,该对象封装了请求和响应对象。然后创建一个任务用于处理耗时逻辑,后面通过AsyncContext对象获得响应对象并对客户端响应,输出“done!”。完成后要通过complete方法告诉Tomcat内部我已经处理完,Tomcat就会请求对象和响应对象进行回收处理或关闭连接。

最新文章