我们一步步走进netty5的源码
首先我们来看一下源码中带的实例源码
这是SecureChat这个实例中的SecureChatServerHandler中的channelActive的相关代码,
其次:我们来观看这个实例重点代码
1>, extends SimpleChannelInboundHandler
2>,static final ChannelGroup channels = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
3>, channels.add(ctx.channel());
其他的暂且不论
然后:我们来详细分析
第一条说明是收信息的,进pipeline进行处理的,
第二条,先看GlobalEventExecutor.INSTANCE,在源码中package io.netty.util.concurrent包内GlobalEventExecutor类中,第41行 public static final GlobalEventExecutor INSTANCE = new GlobalEventExecutor();可以看得很明白了。我研究了一下他的源码大致意思是这个类主要是全局事件处理的
再看new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);在源码io.netty.channel.groupbao中DefaultChannelGroup的第60行是一个有参构造
第三条,可以很明白 的知道是一个集合
最后:我在深入DefaultChannelGroup的源码,我们重点看一下几点
1>extends AbstractSet<Channel> implements ChannelGroup 在源码中42行
2> private static final AtomicInteger nextId = new AtomicInteger();在源码中第44行
3>public DefaultChannelGroup(EventExecutor executor) {
this("group-0x" + Integer.toHexString(nextId.incrementAndGet()), executor);
}在源码中60行
4>
public DefaultChannelGroup(String name, EventExecutor executor) {
if (name == null) {
throw new NullPointerException("name");
}
this.name = name;
this.executor = executor;
}在源码69行
5> private final ConcurrentMap<ChannelId, Channel> serverChannels = PlatformDependent.newConcurrentHashMap();
private final ConcurrentMap<ChannelId, Channel> nonServerChannels = PlatformDependent.newConcurrentHashMap();在源码47行
我们可以看出DefaultChannelGroup是一个AbstractSet集合,实现了ChannelGroup ,并且使用了原子integer-----> AtomicInteger 结合第三可以看出ChannelId 是有框架自动生成的,也可以定制。在源码中始终没有一个返回map的方法,想用的话可以自己定义一个,但DefaultChannelGroup中的每一个方法都跟map有关,都是在操作map
总结:我们知道ChannelId是自动生成的,可以定制,这是一个喜讯,我们可以把我们相关的userId绑定,为我们做服务,自己在DefaultChannelGroup定义一个定义一个也可以,本人不推荐自定义map,但推荐定制ChannelId