ajax – 我不明白在servlets 3.0 API的Async支持

前端之家收集整理的这篇文章主要介绍了ajax – 我不明白在servlets 3.0 API的Async支持前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我来自Java SE的背景,我做了一些servlet教程,并阅读Head First JSP& servlet。我正在阅读 JavaWorld.com文章关于Async支持现在,但我不太理解它。

什么是Async是简单的?
Ajax和Servlet Async之间有什么区别?

我有一个PHP背景与ajax和我知道的概念,但我没有尝试过它与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和WHEN的答案不是那么简单。如果你只是想保留线程,在上面的情况下,你将交换一个线程从一个线程池为另一个(在这种情况下是Servlet池对EJB异步池),净效益不会那么多。你也可以给你的Servlet线程池一个额外的线程。

在更高级的场景中,您可以进行更细致的请求管理;将它们分成多个任务,并有一个线程池服务这些任务。例如。想象100个10MB文件的下载请求由10个线程处理,轮询给每个请求发送100KB时间。

另一个应用是需要等待来自外部系统的数据的请求,并且其中该外部系统能够发送可以被中继回请求者的消息。也就是说数据库调用在这里没有意义,因为你需要另一个线程等待响应。然后你将再次更换一个线程。但是如果你需要等待收到的电子邮件,那么一个线程可以等待任何电子邮件,并将其转发到任何已暂停的请求。

猜你在找的Ajax相关文章