我可以在Jetty网络应用程序中调用底层nio频道进行响应吗?

时间:2012-03-12 13:37:15

标签: jetty nio

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

HttpServletResponse

这会复制字节缓冲区,而不是必需的。我想看看我是否可以通过使用NIO缓冲区和通道来提高性能。我知道Jetty正在使用NIO,因为我服务器中的“连接器”属于org.eclipse.jetty.server.nio.SelectChannelConnector类。

有没有办法从servlet获取底层通道?或者有没有办法定义使用File file = ... response.setContentLength((int)file.length()); FileInputStream in = new FileInputStream(file); IOUtils.copy(in, response.getOutputStream()); 而不是java.nio的Jetty特定处理程序?

他们的文档显示Jetty "hello world" handler,但也使用了java.ioHttpServletResponse个流。

2 个答案:

答案 0 :(得分:1)

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

http://git.eclipse.org/c/jetty/org.eclipse.jetty.project.git/tree/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/DefaultServlet.java

第758行是sendData方法的开头。

通常我们建议人们只要配置DefaultServlet,如果他们关心提供静态内容的性能,因为它也让你搞乱缓存标题和那个同类

祝你好运

答案 1 :(得分:0)

  

这会使字节缓冲超出必要的范围。

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

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