`

Netty源码学习-ChannelHandler

阅读更多


一般来说,“有状态”的ChannelHandler不应该是“共享”的,“无状态”的ChannelHandler则可“共享”
例如ObjectEncoder是“共享”的, 但 ObjectDecoder 不是
因为每一次调用decode方法时,可能数据未接收完全(incomplete),
它与上一次decode时接收到的数据“累计”起来才有可能是完整的数据,是“有状态”的

public class SomePipelineFactory implements ChannelPipelineFactory {

	//共享
	private final StringEncoder stringEncoder = new StringEncoder(CharsetUtil.UTF_8);
	
	//定义成static的也可以
	//private static final StringEncoder stringEncoder = new StringEncoder(CharsetUtil.UTF_8);
	
    @Override
    public ChannelPipeline getPipeline() throws Exception {
        ChannelPipeline pipeline = Channels.pipeline();
		pipeline.addLast("stringEncoder", stringEncoder);
		
		//不共享
        pipeline.addLast("handler", new SomeHandler());
        return pipeline;
    }
}


因此,每一次ChannelPipelineFactory.getPipeline被调用时,
如果ChannelHandler是“不共享”的,则会新创建一个ChannelHandler的实例

ChannelPipelineFactory.getPipeline在以下方法中调用:


//NioServerSocketPipelineSink.Boss.registerAcceptedChannel
//SocketChannel(创建了pipeline):
private void registerAcceptedChannel(SocketChannel acceptedSocket, Thread currentThread) {

				//调用PipelineFactory.getPipeline
                ChannelPipeline pipeline =
                    channel.getConfig().getPipelineFactory().getPipeline();
				NioWorker worker = nextWorker();
                worker.register(new NioAcceptedSocketChannel(
                        channel.getFactory(), pipeline, channel,
                        NioServerSocketPipelineSink.this, acceptedSocket,
                        worker, currentThread), null);

}
	
//ServerBootstrap.bind	
//ServerSocketChannel(创建了pipeline):
public Channel bind(final SocketAddress localAddress) {

        ChannelPipeline bossPipeline = pipeline();
        bossPipeline.addLast("binder", binder);
        Channel channel = getFactory().newChannel(bossPipeline);
}



可见:
1.ServerSocketChannel与SocketChannel的pipeline实例不是同一个
每一个Channel都创建一个pipeline
2.ServerSocketChannel只有一个(如果同时绑定两个端口,例如同时提供80和443服务,则有两个)
与之关联的pipeline也只有一个,这pipeline里面的ChannelHandler只有“binder”(通常情况下)
3.SocketChannel会有多个:
socketChannelA--pipelineA(sharedHandler,newHandlerA0, newHandlerB0)
socketChannelB--pipelineB(sharedHandler,newHandlerA1, newHandlerB2)

socketChannelA和socketChannelB可能交由不同的workerThread来处理

因此如果ChannelHandler是“有状态”且“共享”,那就要注意线程同步的问题:

public class SharedHandler extends SimpleChannelUpstreamHandler  {
    
    private volatile int someState;
	//...
}


但查看org.jboss.netty.example.proxy.HexDumpProxyInboundHandler:
public class HexDumpProxyInboundHandler extends SimpleChannelUpstreamHandler {
    private volatile Channel outboundChannel;
	//...
}

public ChannelPipeline getPipeline() throws Exception {
        ChannelPipeline p = pipeline(); // Note the static import.
        p.addLast("handler", new HexDumpProxyInboundHandler(cf, remoteHost, remotePort));
        return p;
    }


不是很理解,照理说,HexDumpProxyInboundHandler是“不共享”的,应该不存在
线程同步的问题,但为什么outboundChannel要定义成“volatile”呢?
0
0
分享到:
评论

相关推荐

    Netty源码教程-3

    在本节"Netty源码教程-3"中,我们将深入探讨Netty这一高性能、异步事件驱动的网络应用程序框架。Netty广泛应用于各种分布式系统、服务器和客户端应用,尤其在处理高并发、低延迟的网络通信场景下,其优势尤为突出。...

    Netty (netty-3.2.5.Final.jar,netty-3.2.5.Final-sources.jar)

    3. **灵活的管道(Pipeline)机制**:网络数据在Netty中通过一系列处理器(ChannelHandler)进行处理,形成了数据处理的管道,开发者可以根据需求自定义处理器,实现复杂的数据处理逻辑。 4. **丰富的协议支持**:...

    netty-all-4.1.5.Final:netty-all-4.1.5.Final源码学习

    在源码学习的过程中,你需要关注以下几个关键知识点: 1. **NIO(Non-blocking I/O)**:Netty基于Java NIO(非阻塞I/O)构建,提供了高效的I/O操作。NIO允许在单个线程中处理多个连接,减少了线程创建和管理的开销...

    Netty权威指南源码-含jar包,导入eclipse直接使用

    在Eclipse中使用Netty源码,你可以深入了解其内部实现,学习如何构建网络服务,理解异步编程和事件驱动模型,这对于提升Java网络编程的能力非常有帮助。同时,有了预封装的jar包,你可以直接运行和测试示例代码,...

    netty-api-chm

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。这个“netty-api-chm”文档集合,显然是为了帮助...这份文档对于源码学习和日常开发都极具价值,值得深入研究。

    netty-4.1.19.Final

    8. **ChannelHandler和Pipeline**:ChannelHandler是Netty中处理事件的核心组件,而Pipeline则是一系列ChannelHandler的链,负责处理和转发I/O事件。 9. **生命周期管理**:每个Netty组件都有明确的生命周期状态,...

    netty-websocket-proxy-1.3.2-bin .zip

    理解 Netty 的事件模型、ChannelHandler 和 ByteBuf 等核心概念对于正确使用和定制这个代理服务至关重要。同时,熟悉 WebSocket 的帧格式和生命周期管理也是必要的,这样才能确保数据传输的准确性和连接的稳定性。 ...

    action源码java-netty-in-action:类似于netty-in-action的源代码,但使用最新版本

    综上所述,"action源码java-netty-in-action"是一个极佳的学习资源,它不仅提供了Netty的最新实践,还鼓励开发者通过源码学习,深入理解网络编程和Netty框架的精髓。对于任何想要提升Java网络编程技能的人来说,这是...

    netty-netty-4.1.19.Final.zip_netty_netty学习_rocketmq

    然后,通过分析RocketMQ的源码,观察它是如何利用Netty来实现网络通信的。可以尝试自己编写简单的Netty服务器和客户端,模拟RocketMQ的消息发布和消费过程,加深理解。 总的来说,Netty作为强大的网络通信框架,为...

    netty-in-action,.zip

    通过对"netty-in-action-master"中的源码进行学习和研究,开发者不仅可以深入了解Netty的工作原理,还能掌握如何在实际项目中运用Netty,提升网络应用的开发效率和质量。同时,开源的特性使得读者可以借鉴和学习其他...

    Netty权威指南源码-maven版

    源代码通常分布在 `src/main/java` 目录下,按照包结构组织,你可以通过阅读这些源代码来学习 Netty 的内部实现机制,比如事件驱动模型、编解码器的设计以及如何编写自定义的 ChannelHandler。 此外,Maven 是一个...

    netty-code:netty包源码-源码包

    Netty 是一个高性能、异步事件驱动...通过对Netty源码的学习,开发者不仅可以掌握网络编程的最佳实践,还能深入了解Java并发编程、内存管理以及性能优化等核心技能,对提升个人技术水平和解决实际问题具有极大的帮助。

    netty 配套资源-代码、文档

    学习 Netty 的资源通常包括源码分析、官方文档、示例项目以及社区提供的教程。压缩包中的“代码”部分可能包含了 Netty 的示例代码或者已经实现的协议处理器,这对于理解框架的工作原理非常有帮助。而“文档”部分...

    netty实战和源码解读-mini-netty.zip

    “mini-netty-master”项目的源码可能会涵盖上述的一些或全部知识点,通过学习和分析这个简化版的实现,你可以更好地理解Netty的设计思想和使用方式,进阶到源码阅读将有助于深入理解Netty的内部工作原理。...

    netty源码深入分析

    《Netty源码深入分析》是由美团基础架构部的闪电侠老师所分享的一系列关于Netty源码解析的视频教程。以下将根据标题、描述、标签以及部分内容等信息,对Netty及其源码进行深入剖析。 ### Netty简介 Netty是基于...

    netty-4.1源代码

    这个“netty-4.1源代码”压缩包包含了Netty框架的4.1版本的源码,对于理解Netty的工作原理、学习网络编程以及优化性能有极大的帮助。 Netty 的核心组件包括: 1. **ByteBuf**: Netty 自定义的字节缓冲区,比Java ...

    netty源码解析视频.txt

    通过对Netty源码的深入分析,我们不仅能够了解到其内部工作原理,还能学习到许多优秀的设计思想和技术实践,这对于提高个人的技术水平和解决实际问题有着非常重要的意义。希望本文能够帮助读者更好地理解和掌握Netty...

    netty源码解析视频

    ### Netty源码解析知识点概览 #### 一、Netty简介与应用场景 - **Netty**是一款由JBOSS提供的高性能的...以上是对“netty源码解析视频”教程涉及的主要知识点进行的详细梳理和解释,希望对你学习Netty源码有所帮助。

    极客时间《Netty源码剖析与实战》学习记录-boy-learning-netty.zip

    在深入探讨 Netty 源码剖析与实战的学习记录之前,我们需要了解 Netty 的基本概念和核心特性。 1. **Netty 简介** - **设计理念**:Netty 的设计目标是简化网络应用的开发,提供一个高度抽象的API,让开发者可以...

    netty-source-analysis-learning-sample-material:netty原始码学习引用资料-源码资源

    这个“netty-source-analysis-learning-sample-material”压缩包文件提供了学习和分析Netty源码的参考资料,帮助开发者深入理解其内部机制。Netty 的设计思想是将复杂的网络编程简化,提供了一种高效、灵活且强大的...

Global site tag (gtag.js) - Google Analytics