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级的。