使用Netty实现Servlet API

17

@Adam,据我所知,Netty是通用的Java NIO客户端服务器套接字框架 - 主要用于使用Java编写网络应用程序。(http://www.jboss.org/netty/community#nabble-td4918947) 你能否更具体地说明为什么你需要使用Servlet API来使用Netty,并且为什么现有的服务器如Jetty/Tomcat不能满足你的需求? - Santosh
3
希望能打破现有的每个请求一个线程的模式。与事件IO队列相比,每个请求一个线程的处理方式扩展性不太好。 - Adam Gent
4个回答

18

Jersey不需要servlet - 即使使用JDK中包含的轻量级http服务器也可以正常运行,甚至可以使用类似于Netty的Grizzly NIO框架运行(请参见grizzly.java.net)。要了解如何使其与Netty一起运行,您可能需要查看Jersey工作区中的jersey-grizzly2模块 - 如果您愿意开发并为Jersey项目做出贡献,那将非常好。

现在,让您失望的是,Jersey使用ThreadLocals。我们一直计划引入对非阻塞异步调用的支持,但这需要进行相当数量的重构,因此只会在2.0版本中实现(一旦JAX-RS 2.0定稿)。无论如何,除了非阻塞内容之外,将其在类似于Netty的Grizzly框架上运行仍然很有用,因为它很“轻巧”。


谢谢!我会看看是否有任何方式可以做出贡献。 - Adam Gent
也许我可以在这里使用ThreadLocals:https://issues.jboss.org/browse/NETTY-93 - Adam Gent
嗨,亚当,没错 - 我们计划利用Grizzly中的类似功能,并最终可能在其他框架中使用。问题是,这需要对Jersey核心库进行重构 - 这不仅仅是编写Netty插件的问题。这就是为什么在Jersey 2.0之前我们可能不会处理它的原因。 - Martin Matula
那么真正的问题是:由于Jersey正在使用ThreadLocals,Grizzly NIO集成实际上是否安全? - Matt Wonlaw
只有Jersey 1.x会遇到这个问题,而且是安全的,因为它同步处理请求,即不利用Grizzly的非阻塞特性。 - Martin Matula

4
如果您想使用JerseyNetty一起,您可能需要保险起见使用org.jboss.netty.channel.socket.oio.OioServerSocketChannelFactory而不是:
org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory

这将使得在负载下ThreadLocal的东西能够正确地工作。
当然,当Jersey升级到不再使用ThreadLocal,而是使用ChannelLocal时,这将不再需要。

2

1

你是否在寻找Netty-Servlet-bridge

该项目为Netty.IO框架(http://netty.io/)提供了Servlet API实现。

Netty Servlet Bridge允许将现有的基于Servlet API的Web应用程序集成到基于Netty的基础设施中。


1
尚未完全实现,但 Vaadin 示例可以运行。 - Ravindranath Akila

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接