Java 异步servlet与同步servlet

Java 异步servlet与同步servlet,java,servlets,asynchronous,jakarta-ee,Java,Servlets,Asynchronous,Jakarta Ee,因为支持。始终使用异步处理会更好吗?或者在什么情况下同步处理更好?对于在整个请求处理周期中不需要保留线程的情况,引入了异步处理。这种情况的典型示例是类功能 在所有情况下使用异步处理都没有任何价值,因为通常后端处理无论如何都会消耗线程。阅读本文,Servlet 3.0规范中的异步处理支持有一个非常特定的用例——它被设计用于处理AJAX应用程序发出的请求可能会触发后台长时间运行的进程的情况 我们需要这样做的原因是为了响应每个请求线程模型中的一个问题,该模型在客户机每次从服务器请求页面时分配一个线程,

因为支持。始终使用异步处理会更好吗?或者在什么情况下同步处理更好?

对于在整个请求处理周期中不需要保留线程的情况,引入了异步处理。这种情况的典型示例是类功能


在所有情况下使用异步处理都没有任何价值,因为通常后端处理无论如何都会消耗线程。

阅读本文,Servlet 3.0规范中的异步处理支持有一个非常特定的用例——它被设计用于处理AJAX应用程序发出的请求可能会触发后台长时间运行的进程的情况

我们需要这样做的原因是为了响应每个请求线程模型中的一个问题,该模型在客户机每次从服务器请求页面时分配一个线程,而不是为客户机的整个会话分配一个线程。在AJAX之前,当客户端偶尔发出请求时,这种方法很有效,但当AJAX应用程序显著增加客户端发出的请求数量时,这种方法的好处就失去了

具体地说,如果AJAX请求触发了一些可能缓慢或阻塞的事件,比如数据库操作,那么我们就回到了开始的地方——服务器线程池中的线程可能处于空闲状态

异步处理支持试图通过将请求放入一个集中队列来缓解这种情况,这样线程就不会总是等待可能还没有开始处理的请求的结果。简言之,我们一直在努力从线程中获得最大的收益——也就是说,减少线程空闲时的时间量(但可以服务于其他连接)


像任何新的发展一样,这不是一个一刀切的工具。在应用程序中寻找合适的特定情况。

我刚刚浏览了链接文章,这是服务器端改进,而不是客户端异步

总结这篇文章:

在有大量请求进入的情况下(类似于用AJAX请求攻击服务器),您可能希望使用异步servlet,并且不希望为每个请求提供一个线程。在这种情况下,TPR可能是危险的,因为处理时间需要一段时间,导致线程池耗尽

作业将被卡在作业队列中,线程可以退出,直到作业完成,并且当资源释放以允许其完成时,响应最终提交


非常酷的东西。

异步servlet带来的最大好处是,服务器可以在选择时将信息发送回客户端,而不是在客户端请求时。在异步servlet之前,这将需要长时间运行的HTTP连接,每个连接都绑定了一个服务器线程,这是非常低效的。这个新模型将服务器端处理与连接处理分离。

它基于这样的要求:在这种情况下,线程有可能处于空闲状态,你应该使用异步Servlet,否则就不会因为我们不能生成这么多线程而导致

如果servlet或筛选器在处理请求时遇到潜在的阻塞操作,它可以将该操作分配给异步执行上下文,并将与请求关联的线程立即返回到容器,而不生成响应。阻塞操作在不同线程的异步执行上下文中完成,该线程可以生成响应或将请求分派到另一个servlet

要在servlet上启用异步处理,请在@WebServlet注释中将参数asyncSupported设置为true,如下所示:

@WebServlet(urlPatterns={“/asyncservlet”},asyncSupported=true) 公共类AsyncServlet扩展HttpServlet{…}

同步(经典Web应用程序模型) 同步请求会阻止客户端,直到操作完成,即浏览器没有响应。在这种情况下,浏览器的java脚本引擎被阻止

异步(AJAX Web应用程序模型) 异步请求不会阻止客户端,即浏览器响应。此时,用户还可以执行其他操作。在这种情况下,浏览器的java脚本引擎不会被阻止

在同步通信中,两者同时处于活动状态,在异步通信中,不需要同时处于活动状态。例如,异步指的是消息传递,阻止对新线程的操作,并运行与容器关联的线程

应用服务器中的Web容器通常为每个客户端请求使用服务器线程。在重载条件下,容器需要大量线程来满足所有客户机请求。可伸缩性限制包括内存不足或耗尽容器线程池。要创建可伸缩的web应用程序,必须确保没有与请求关联的线程处于空闲状态,以便容器可以使用它们来处理新请求

有两种常见的情况,与请求关联的线程可能处于空闲状态

The thread needs to wait for a resource to become available or process data before building the response. For example, an application may need to query a database or access data from a remote web service before generating the response.

The thread needs to wait for an event before generating the response. For example, an application may have to wait for a JMS message, new information from another client, or new data available in a queue before generating the response.

如果您在服务器端检查ajax数据,而用户转到另一个网页,会发生什么情况?所以现在他们不再需要这些数据了?或者如果用户刷新页面会发生什么?现在服务器端会有两个实例从用户那里检查数据吗?