Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Servlet3.1异步io有什么真正的好处吗?_Java_Performance_Tomcat_Servlets_Nio - Fatal编程技术网

Java 使用Servlet3.1异步io有什么真正的好处吗?

Java 使用Servlet3.1异步io有什么真正的好处吗?,java,performance,tomcat,servlets,nio,Java,Performance,Tomcat,Servlets,Nio,我想知道,如果像Tomcat、Jetty等servlet容器已经使用nio来读写数据,是否真的需要在servlet输入和输出流上使用setWritelistner和setReadListner?是否有任何额外的性能增益?好处并不直接与“性能增益”有关。这些方法的目的是避免请求线程(在异步模式下)在读取输入(POST)数据或写入文档时阻塞 JavaEE7教程中有一个例子:(链接更新) 这与Tomcat在幕后使用nio是正交的 1-存在间接的绩效效益。当线程可能阻塞网络I/O时,提高吞吐量的另一种

我想知道,如果像Tomcat、Jetty等servlet容器已经使用nio来读写数据,是否真的需要在servlet输入和输出流上使用
setWritelistner
setReadListner
?是否有任何额外的性能增益?

好处并不直接与“性能增益”有关。这些方法的目的是避免请求线程(在异步模式下)在读取输入(POST)数据或写入文档时阻塞

JavaEE7教程中有一个例子:(链接更新)

这与Tomcat在幕后使用nio是正交的


1-存在间接的绩效效益。当线程可能阻塞网络I/O时,提高吞吐量的另一种策略是增加工作线程的数量。但这会增加内存占用(除其他外),导致更多的“开销”。

Tomcat读取头文件(并且在NIO的非阻塞模式下执行此操作) 但是读取请求主体是一个应用程序问题,需要执行 具有阻塞IO(直到规范的Servlet 3.0要求)。同样地 写入响应是通过阻塞IO完成的,因为这也是一个 规范的要求

所有这些都在Servlet3.1中进行了更改

你可能想看看这个

下面的段落和代码示例来自JavaEE7 Recipes,它解释了setWritelistner和setReadListner的用法

要实现非阻塞I/O解决方案,需要新的编程接口 已添加到ServletInputStream和ServletOutputStream 作为两个事件侦听器:ReadListener和WriteListener。ReadListener WriteListener接口使servlet I/O处理在 一种非阻塞方式,通过在 servlet内容可以在不阻塞的情况下读取或写入。使用 ServletInputStream.setReadList ener(ServletInputStream,AsyncContext) 方法向ServletInputStream注册ReadListener,并使用 I/O读取 ServletInputStream.setWriteListener(ServletOutputStream,AsyncContext) 用于注册WriteListener的方法。以下代码行 演示如何将ReadListener实现注册到 ServletInputStream:


在某些情况下,异步IO会对性能产生深远的影响。我的经验主要与ASP.NET等效,但在这里也应该适用

servlet有有限数量的线程来处理请求。如果存在任何类型的阻塞IO(网络请求、数据库查询等),则处理请求的线程在等待IO完成时仍在使用。在高容量场景中,这可能会导致线程池不足,并导致严重的性能下降


对于异步IO,IO不会阻止请求线程。相反,会注册回调,并在IO完成时调用回调。同时,线程被返回到线程池,在那里它可以继续为其他请求提供服务。

我开始阅读关于servlet 3.1的信息,但我不清楚将作业发送到后台执行器和返回容器线程的servlet如何获得一些东西,执行器本身就是一个线程,如果您可以避免在等待对后端服务的请求之类的事情完成时阻塞请求线程,那么异步的好处就会增加。显然,如果你在后台线程中做实际工作。。。不是别的机器。。。你没有取得多大成就。我认为您考虑的用例是错误的。那么,当作业由另一台服务器执行时,真正的收益是多少?比如微服务?这不是一台服务器做每一件事吗?甚至这个服务器也是一个多层应用程序?不一定。您还需要考虑磁盘延迟和不同的应用程序服务器性能属性等因素。
AsyncContext context = request.startAsync();
ServletInputStream input = request.getInputStream();
input.setReadListener(new ReadListenerImpl(input, context));