ajax - 我不了解Servlets 3.0 API中的异步支持

标签 ajax jakarta-ee servlets

我来自Java SE背景,并且做了一些servlet教程,并阅读了Head First JSP和servlet。我现在正在阅读有关异步支持的JavaWorld.com文章,但我不太了解。

异步到底是什么?
Ajax和Servlet Async有什么区别?

P.S我有一个使用ajax的PHP背景,我知道这个概念,但是我还没有在Java上尝试过

最佳答案

在传统的Servlet模型中,通常1个请求对应1个线程。

这些线程通常来自由Servlet容器管理的池。只要Servlet容器在此池中有空闲线程,就只能处理新请求。只要您自己的代码正忙于处理请求,线程就不会空闲。

在某些情况下,打破这种模式可能是值得的。发生的情况是,请求通过这样的Servlet容器托管线程到达Servlet,然后您的代码要求异步执行。然后,您可以从Servlet请求返回,容器线程将被释放。

与同步请求处理相反,这将不会提交任何响应,也不会关闭连接。相反,您可以将异步上下文移交给另一个线程池,该线程池可以将其拾取,并且当某个线程有空处理它时,可以对其进行服务并能够写入响应。

一个例子:

@WebServlet(urlPatterns = "/somepath", asyncSupported = true)
public class AsyncServlet extends HttpServlet {

    @EJB
    private AsyncBean asyncBean;

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        AsyncContext asyncContext = request.startAsync();

        // The following line will not block and return immediately
        asyncBean.doAsyncStuff(asyncContext);

    } // Shortly after this method has ended, thread will be returned to pool
}

随着AsyncBean被实现为:
@Stateless
public class AsyncBean {

    @Asynchronous
    public void doAsyncStuff(AsyncContext asyncContext) throws IOException {
        asyncContext.getResponse().getWriter().write("test");
    }
}

在上面的代码中,从AsyncServlet#doGet()方法返回后不久,Servlet线程将返回到池中。用于执行AsyncBean#doAsyncStuff()的“请求”(任务)将被放入队列中,以供EJB线程池使用。

为什么使用WHY和何时使用的答案并不那么简单。如果您只想保留线程,那么在上述情况下,您将一个线程池中的一个线程交换为另一个线程池(在这种情况下,是Servlet池与EJB异步池),那么实际 yield 不会那么多。您也可以给Servlet线程池一个额外的线程。

但是,在更高级的场景中,您可以对请求进行更细粒度的管理。将它们分为多个任务,并为这些任务提供线程池。例如。想象一下,由10个线程处理的10MB文件有100个下载请求,这些线程循环发送给每个请求100KB的时间。

又一个应用是需要等待来自外部系统的数据的请求,并且该外部系统能够发送可以中继回请求者的消息。即这里的数据库调用没有意义,因为无论如何您都需要另一个线程来等待响应。然后,您将一个线程再次更改为另一个线程。但是,如果您需要等待传入的电子邮件,那么一个线程可以等待任何电子邮件并将其转发给任何暂停的请求。

关于ajax - 我不了解Servlets 3.0 API中的异步支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10065553/

相关文章:

Javascript - 警告持有 XMLDocument 或 Document 的对象

php - 如果端口打开,则使用 ajax 图像;如果未打开,则使用备用图像

javascript - 如何循环遍历不同的 iframe?

java - 单独 WAR 中的 Servlet - 部分共享其上下文根

java - 使用 Java Servlet 提供 Gzip 压缩内容

java - JSF/Primefaces-用户界面 :param in p:ajax element

maven-2 - 如何使用 Maven 在 RAD 中构建 J2EE EAR 文件?

java - 在应用程序服务器中调用远程 Bean 与本地 Bean

java - 无法处理部署的 POST_MODULE 阶段

java - 无法连接到servlet中的mysql数据库