Netty: 几个关键对象生命周期之间的关联

pipeline, handler, channelHandlerContext这样对象倒底是channel级的,还是event级的,又或者是系统级的? 或者这样问,一个连接中只有一个相应的实例,抑或每来一个消息都会生成一个相应的实例,又或者整个系统共享一个相应的实例?

一般来说,一个pipeline实例只属于一个channel,不会跨channel共享。因为你的pipeline factory一般会这样写:

ChannelPipeline pipeline = Channels.pipeline(); //为channel生成pipeline时总是new一个

当然,如果你有特殊需求,你也可以改变写法,让pipeline在channel间共享。下面假设你没有特殊需求,一个pipeline实例只需于一个channel.

一个channel只有一个pipeline. Channel建立时,会通过pipeline factory新生成相应的pipeline对象,ChannelPipeline pipeline = Channels.pipeline(); 后续的读写中,直接使用这个pipeline对象,不再创建新的pipeline.

由于pipeline和handler的结构关系,所以对于单种handler,一个pipeline实例中只有一个handler实例,除非你的pipeline中有重复的handler.

一个handler的实例可以只属于一个pipeline实例,

    pipeline.addLast("decoder", new HttpRequestDecoder());

也可以声明为单例,在pipeline实例间共享,也就是在多个channel间共享,这时你要注意线程安全的问题。

    pipeline.addLast("decoder", httpRequestDecoder());

pipeline实例中每新增一次handler(即使是同一个实例), 都会生成一个相应的ChannelHandlerContext实例。这里可以推出两个结论:

  1. pipeline中如果有两个handler,  那么每个handler各有各的ChannelHandlerContext对象,互不相干。

  2. 对于一个channel来说,只会生成一次pipeline,所以对于单种handler,一个pipeline实例中只有一个相应的ChannelHandlerContext实例。也就是说,对于单种handler, 相应的channelHandlerContext是channel级的,而不是event级的。

Leave a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.