一般来说,“有状态”的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”呢?
分享到:
相关推荐
在本节"Netty源码教程-3"中,我们将深入探讨Netty这一高性能、异步事件驱动的网络应用程序框架。Netty广泛应用于各种分布式系统、服务器和客户端应用,尤其在处理高并发、低延迟的网络通信场景下,其优势尤为突出。...
3. **灵活的管道(Pipeline)机制**:网络数据在Netty中通过一系列处理器(ChannelHandler)进行处理,形成了数据处理的管道,开发者可以根据需求自定义处理器,实现复杂的数据处理逻辑。 4. **丰富的协议支持**:...
在源码学习的过程中,你需要关注以下几个关键知识点: 1. **NIO(Non-blocking I/O)**:Netty基于Java NIO(非阻塞I/O)构建,提供了高效的I/O操作。NIO允许在单个线程中处理多个连接,减少了线程创建和管理的开销...
在Eclipse中使用Netty源码,你可以深入了解其内部实现,学习如何构建网络服务,理解异步编程和事件驱动模型,这对于提升Java网络编程的能力非常有帮助。同时,有了预封装的jar包,你可以直接运行和测试示例代码,...
Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。这个“netty-api-chm”文档集合,显然是为了帮助...这份文档对于源码学习和日常开发都极具价值,值得深入研究。
8. **ChannelHandler和Pipeline**:ChannelHandler是Netty中处理事件的核心组件,而Pipeline则是一系列ChannelHandler的链,负责处理和转发I/O事件。 9. **生命周期管理**:每个Netty组件都有明确的生命周期状态,...
理解 Netty 的事件模型、ChannelHandler 和 ByteBuf 等核心概念对于正确使用和定制这个代理服务至关重要。同时,熟悉 WebSocket 的帧格式和生命周期管理也是必要的,这样才能确保数据传输的准确性和连接的稳定性。 ...
综上所述,"action源码java-netty-in-action"是一个极佳的学习资源,它不仅提供了Netty的最新实践,还鼓励开发者通过源码学习,深入理解网络编程和Netty框架的精髓。对于任何想要提升Java网络编程技能的人来说,这是...
然后,通过分析RocketMQ的源码,观察它是如何利用Netty来实现网络通信的。可以尝试自己编写简单的Netty服务器和客户端,模拟RocketMQ的消息发布和消费过程,加深理解。 总的来说,Netty作为强大的网络通信框架,为...
通过对"netty-in-action-master"中的源码进行学习和研究,开发者不仅可以深入了解Netty的工作原理,还能掌握如何在实际项目中运用Netty,提升网络应用的开发效率和质量。同时,开源的特性使得读者可以借鉴和学习其他...
源代码通常分布在 `src/main/java` 目录下,按照包结构组织,你可以通过阅读这些源代码来学习 Netty 的内部实现机制,比如事件驱动模型、编解码器的设计以及如何编写自定义的 ChannelHandler。 此外,Maven 是一个...
Netty 是一个高性能、异步事件驱动...通过对Netty源码的学习,开发者不仅可以掌握网络编程的最佳实践,还能深入了解Java并发编程、内存管理以及性能优化等核心技能,对提升个人技术水平和解决实际问题具有极大的帮助。
学习 Netty 的资源通常包括源码分析、官方文档、示例项目以及社区提供的教程。压缩包中的“代码”部分可能包含了 Netty 的示例代码或者已经实现的协议处理器,这对于理解框架的工作原理非常有帮助。而“文档”部分...
“mini-netty-master”项目的源码可能会涵盖上述的一些或全部知识点,通过学习和分析这个简化版的实现,你可以更好地理解Netty的设计思想和使用方式,进阶到源码阅读将有助于深入理解Netty的内部工作原理。...
《Netty源码深入分析》是由美团基础架构部的闪电侠老师所分享的一系列关于Netty源码解析的视频教程。以下将根据标题、描述、标签以及部分内容等信息,对Netty及其源码进行深入剖析。 ### Netty简介 Netty是基于...
这个“netty-4.1源代码”压缩包包含了Netty框架的4.1版本的源码,对于理解Netty的工作原理、学习网络编程以及优化性能有极大的帮助。 Netty 的核心组件包括: 1. **ByteBuf**: Netty 自定义的字节缓冲区,比Java ...
通过对Netty源码的深入分析,我们不仅能够了解到其内部工作原理,还能学习到许多优秀的设计思想和技术实践,这对于提高个人的技术水平和解决实际问题有着非常重要的意义。希望本文能够帮助读者更好地理解和掌握Netty...
### Netty源码解析知识点概览 #### 一、Netty简介与应用场景 - **Netty**是一款由JBOSS提供的高性能的...以上是对“netty源码解析视频”教程涉及的主要知识点进行的详细梳理和解释,希望对你学习Netty源码有所帮助。
在深入探讨 Netty 源码剖析与实战的学习记录之前,我们需要了解 Netty 的基本概念和核心特性。 1. **Netty 简介** - **设计理念**:Netty 的设计目标是简化网络应用的开发,提供一个高度抽象的API,让开发者可以...
这个“netty-source-analysis-learning-sample-material”压缩包文件提供了学习和分析Netty源码的参考资料,帮助开发者深入理解其内部机制。Netty 的设计思想是将复杂的网络编程简化,提供了一种高效、灵活且强大的...