我可以在Jetty web app中调用底层nio通道以获得响应吗?

我可以在Jetty web app中调用底层nio通道以获得响应吗?,jetty,nio,Jetty,Nio,我正在编写一个web应用程序,它发送一些直接文件以响应某些请求。我想用Java来处理这个问题,而不是nginx等。在标准servlet中,唯一的选择是使用HttpServletResponse的Java.io.OutputStream File file = ... response.setContentLength((int)file.length()); FileInputStream in = new FileInputStream(file); IOUtils.c

我正在编写一个web应用程序,它发送一些直接文件以响应某些请求。我想用Java来处理这个问题,而不是nginx等。在标准servlet中,唯一的选择是使用
HttpServletResponse
Java.io.OutputStream

File file = ...
response.setContentLength((int)file.length());
FileInputStream in = new FileInputStream(file);            
IOUtils.copy(in, response.getOutputStream());  
这复制字节缓冲区的数量超过了需要的数量。我想看看是否可以通过使用NIO缓冲区和通道来提高性能。我知道Jetty在幕后使用NIO,因为我的服务器中的“连接器”是一流的

有没有办法从servlet获取底层通道?或者有没有一种方法可以定义使用
java.nio
而不是
java.io
的特定于Jetty的处理程序


他们的文档显示了一个,但也使用了
HttpServletResponse
java.io
流。

我想看看DefaultServlet,它已经做了类似的事情,并且还作为一个示例,说明了servlet如何使用直接缓冲区来更有效地提供这样的静态资源

第758行是sendData方法的开始

通常,如果人们关心服务静态内容的性能,我们建议他们只配置DefaultServlet,因为它还可以让您处理缓存头和类似的问题


祝你好运

我会看一看DefaultServlet,它已经做了类似的事情,也可以作为一个示例,说明servlet如何使用直接缓冲区来更有效地提供这样的静态资源

第758行是sendData方法的开始

通常,如果人们关心服务静态内容的性能,我们建议他们只配置DefaultServlet,因为它还可以让您处理缓存头和类似的问题

祝你好运

这复制字节缓冲区的数量超过了需要的数量

如果使用分块流模式,则不会。当您这样做时,根本没有字节缓冲区,除非
IOUtils.copy()
这样做,在这种情况下,不要使用它,请自己编写4行代码

使用ByteBuffers的原因是,Java将尝试正确设置内容长度响应标头,方法是将输出累积到BB中,然后在发送标头之前获取其大小,然后将BB内容作为正文发送。我认为自己设置标题没有实际效果

这复制字节缓冲区的数量超过了需要的数量

如果使用分块流模式,则不会。当您这样做时,根本没有字节缓冲区,除非
IOUtils.copy()
这样做,在这种情况下,不要使用它,请自己编写4行代码


使用ByteBuffers的原因是,Java将尝试正确设置内容长度响应标头,方法是将输出累积到BB中,然后在发送标头之前获取其大小,然后将BB内容作为正文发送。我相信自己设置标题没有实际效果。

这正是我想要的。谢谢,正是我想要的。谢谢。我不熟悉这种“分块流模式”?您可以展示一些JavaServlet代码来实现这一点吗?我们所说的“字节缓冲区”可能意味着不同的东西。如果您使用java.io streams发送文件,即使是在小块中,与直接NIO缓冲区相比,仍有更多的复制在后台进行,因为普通java对象和字节数组不能直接传递给本机io函数。@RobN好问题,我不知道如何在servet中设置它。我本以为这是一种
HttpServletResponse
方法。可能是servlet或容器属性。或者可能是
setBufferSize()
做到了。我不熟悉这种“分块流模式”?您可以展示一些JavaServlet代码来实现这一点吗?我们所说的“字节缓冲区”可能意味着不同的东西。如果您使用java.io streams发送文件,即使是在小块中,与直接NIO缓冲区相比,仍有更多的复制在后台进行,因为普通java对象和字节数组不能直接传递给本机io函数。@RobN好问题,我不知道如何在servet中设置它。我本以为这是一种
HttpServletResponse
方法。可能是servlet或容器属性。或者可能是
setBufferSize()
做到了这一点。