详谈ChannelGroup功能之一

我们一步步走进netty5的源码

首先我们来看一下源码中带的实例源码

详谈ChannelGroup功能之一_第1张图片

这是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



   




你可能感兴趣的:(netty,ChannelId,ChannelGroup)