web学习——异步支持AsyncSupported

如下内容均来自于官方文档java

1.为何要异步支持?web

应用服务器中的Web容器一般使用每一个客户机请求的服务器线程。在重负载条件下,容器须要大量的线程来知足全部客户机请求。可伸缩性限制包括耗尽内存或耗尽容器线程池。要建立可伸缩的web应用程序,您必须确保没有与请求关联的线程处于闲置状态,所以容器可使用它们来处理新请求。数据库

简单点说,就是为了节约服务器端的资源服务器

2.异步支持的应用场景异步

  ①.在构建响应以前,线程须要等待资源变为可用或处理数据。好比,一个应用程序须要查询数据库或者在生成响应以前从远程web服务访问数据。async

  ②.在生成响应以前,线程须要等待一个事件。好比,一个应用程序可能必须等待一个JMS信息,在生成响应以前,等待来自另外一个客户机的新信息或在队列中可用的新数据。spa

这些场景表示限制web应用程序可伸缩性的操做。异步处理指将这些阻塞操做分配给一个新线程,并将与请求关联的线程从新调整到容器线程

 3.sevlet中的异步处理对象

Java EE为servlet和过滤器提供异步处理支持。若是servlet或过滤器在处理请求时达到了潜在的阻塞操做,它能够将操做分配给异步执行上下文,并将与请求关联的线程当即返回到容器中,而不会生成响应。阻塞操做在不一样线程中完成异步执行上下文,能够生成响应或将请求发送给另外一个servlet。blog

要在servlet上启用异步处理,能够在@WebServlet注解上将参数asyncsupport设置为true:

javax.servlet.AsyncContext类提供了在服务方法中执行异步处理所需的功能。要得到一个AsyncContext实例,请在服务方法的请求对象上调用startAsync()方法;例如:

此调用将请求放入异步模式,并确保在退出服务方法后不会提交响应。在阻塞操做完成或将请求发送到另外一个servlet以后,你必须在异步上下文中生成响应。

容器提供了一个不一样的线程,其中阻塞操做能够被处理。

  AsyncContext类提供的方法:

    void start(Runnable run):为阻塞操做提供代码,做为实现Runnable接口的类。当调用start方法或使用其余机制将    AsyncContext实例传递给类时,您能够将该类做为一个内部类提供。

    ServletRequest getRequest():返回用于初始化此异步上下文的请求。在上面的示例中,请求与服务方法相同。

你可使用这个方法在异步上下文获取从请求参数。

    ServletResponse getResponse():返回用于初始化此异步上下文的响应。在上面的示例中,响应与服务方法相同。

你能够在异步上下文中使用此方法来将阻塞操做的结果写入响应。

    void complete():完成异步操做并关闭与此异步上下文关联的响应。在异步上下文中写入响应对象以后,调用此方法。

    void dispatch(String path):将请求和响应对象分派到给定的路径。在阻塞操做完成以后,使用此方法让另外一个servlet写入响应。

4.实例

MyRemoteResource是一个模拟的资源类。

解释:

  在上面的列子中,startasync()使请求被异步处理;在服务方法结束时,不会将响应发送到客户端。acontext.start(new Runnable(){})从容器中获取一个新线程。

内部类的run()方法中的代码在新线程中执行。内部类能够访问异步上下文,从请求中读取参数并写入响应。调用异步上下文的complete()方法提交响应并将其发送给客户机。

AsyncServlet的服务方法当即返回,请求在异步上下文中处理。

相关文章
相关标签/搜索