我查看了Netty文档,并在示例源类中找到了一些注释:org.jboss.netty.example.factorial.FactorialServerHandler,在这个src中,有一些注释:
//##in org.jboss.netty.example.factorial.FactorialServerPipelineFactory
......
// and then business logic.
// Please note we create a handler for every new channel
// because it has stateful properties.
pipeline.addLast("handler", new FactorialServerHandler());
但是,我重新检查其他示例,例如TelnetServerPipelineFactory,似乎没什么区别,句柄是通过以下方式创建的:
// and then business logic.
pipeline.addLast("handler", new TelnetServerHandler());
所有处理程序都是由带有“new”的管道创建的? Netty中的所有示例都是有状态的?显然Echo / Telnet不需要保持有状态的支持。
在我的旧项目中,我使用Netty创建一个Http Server作为RESTful服务器,我的处理程序代码是:
public class HttpServerPipelineFactory implements ChannelPipelineFactory {
private final HttpServerHandler handler;
public ChannelPipeline getPipeline() throws Exception {
ChannelPipeline pipeline = pipeline();
pipeline.addLast("decoder", new HttpRequestDecoder());
pipeline.addLast("aggregator", new HttpChunkAggregator(1048576));
pipeline.addLast("encoder", new HttpResponseEncoder());
pipeline.addLast("handler", handler); //singleton
return pipeline;
}
}
我的RESTful服务器是无状态的(这是REST
含义之一),所以我使用了单例句柄。我是对的吗?
答案 0 :(得分:1)
当文档说“有状态”时,意味着状态信息作为字段存储在ChannelHandler中,因此不可能在不同的Channel之间共享ChannelHandler。如果您没有将状态信息存储为字段,则可以将其用作Singelton。
答案 1 :(得分:0)
如果他们是无国籍人,你没有理由实例化新的处理程序。但是在Http示例中,那些处理程序是有状态的。它们从网络中逐帧接收并将它们解析为标题和什么不是。然后,如果请求被分块,则聚合器将块组合成单个有效负载等。简而言之,除非您构建回显服务器,否则较低级别的处理程序可能必须是有状态的,但更高级别不需要。