美文网首页
ServerBootstrapAcceptor 作用

ServerBootstrapAcceptor 作用

作者: 7ee4c95bcc68 | 来源:发表于2020-10-10 17:02 被阅读0次

ServerBootstrapAcceptor是用来处理当BossGroup(EventLoopGroup)里面有新的客户端连接产生时候 将新连接(NioSocketChannel)交给WorkerGroup(EventLoopGroup)

private static class ServerBootstrapAcceptor extends ChannelInboundHandlerAdapter {
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
        final Channel child = (Channel) msg;
        //将新的channelHandler(MySocketServerInitializer)添加到pipeline 
        //同时会添加一个pendingHandlerCallback里面包含了当前ChannelHandlerContext
        //当后面调用注册方法的时候会触发pipeline上的HandlerAdded方法回调 pendingHandlerCallback里面的方法
        child.pipeline().addLast(childHandler);
        setChannelOptions(child, childOptions, logger);
        try {
            //将新的连接(NioSocketChannel)注册到WorkerGroup中的一个WorkerEventLoop(EventLoop)
            //会从WorkerGroup获取一个WorkerEventLoop挑选方法可以看一下
            childGroup.register(child).addListener(new ChannelFutureListener() {
                @Override
                public void operationComplete(ChannelFuture future) throws Exception {
                    if (!future.isSuccess()) {
                        forceClose(child, future.cause());
                    }
                }
            });
        } catch (Throwable t) {
            forceClose(child, t);
        }
    }
}
io.netty.channel.AbstractChannel.AbstractUnsafe#register0
    private void register0(ChannelPromise promise) {
        try {
            //真正将channel注册到 WorkerEventLoop中的Selecter上
            doRegister();
            //调用pipeline.callHandlerAddedForAllHandlers()方法
            // PendingHandlerCallback task
            // ctx.callHandlerAdded()
            // 触发了注册方法 @2
            //注:这个时候pipline上只有三个head MySocketServerInitializer tail 三个handler
            // 其中 head tail这两个handler是在创建NioSocketChannel时候创建pipeline默认生成的
            // 一个NioSocketChannel只绑定一个pipeline 参见@1
            // MySocketServerInitializer是在ServerBootstrapAcceptor中拿到连接时候直接加上的
            pipeline.invokeHandlerAddedIfNeeded();
            safeSetSuccess(promise);
            pipeline.fireChannelRegistered();
            // Only fire a channelActive if the channel has never been registered. This prevents firing
            // multiple channel actives if the channel is deregistered and re-registered.
            if (isActive()) {
                if (firstRegistration) {
                    pipeline.fireChannelActive();
                } else if (config().isAutoRead()) {
                    beginRead();
                }
            }
        } catch (Throwable t) {
            // Close the channel directly to avoid FD leak.
            closeForcibly();
            closeFuture.setClosed();
            safeSetFailure(promise, t);
        }
    }

@1
public abstract class AbstractChannel extends DefaultAttributeMap implements Channel {
    private final Channel parent;
    private final ChannelId id;
    private final Unsafe unsafe;
    private final DefaultChannelPipeline pipeline;
}
@2
public abstract class ChannelInitializer<C extends Channel> extends ChannelInboundHandlerAdapter {
  public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
        if (ctx.channel().isRegistered()) {
            if (initChannel(ctx)) {
                removeState(ctx);
            }
        }
    }
}   

相关文章

  • ServerBootstrapAcceptor 作用

    ServerBootstrapAcceptor是用来处理当BossGroup(EventLoopGroup)里面有...

  • 作用与反作用

    “别在伤口上撒盐”这句话听着有些难过,但是,在伤口上撒盐未必也不是好事,相反,有消杀细菌的作用,凡事无绝对。

  • 作用与反作用

    今日,我心情很好。赞叹自己能够在这段时间尽早地发现自己的一些问题。 我最近一直在观察自己,为什么碰到大事就容易退缩...

  • 水在烹饪中的作用

    漂洗作用,浸润作用,分散作用,传热作用,溶解作用。

  • 作用

    作业

  • 作用

    如果我们没有完全活在当下,就不会完全沉浸在痛苦当中。这便是,我们逃离当下,会活在过去,我活在未来的憧憬中的原因。我...

  • 作用

    任何东西都有作用,尽管是特别没用的东西,也能起到作用。 就像空气,虽然我们看不见它,但是他它可以...

  • 作用

    大宝贝儿上学时候的作业本,没用上,存着了。现在要绘画,正好有空白页,那就画呗。 普通的本子因为承载的不同而变得有不...

  • 作用

    每个人说得都对,那就听自己的。批评自然有价值,但如果丝毫不反思也毫无作用。

  • 作用

    每个人都有失败的经历。然而,在室外之后,有些人的态度就是失望,沮丧,一蹶不振,有些人就是稍作调整,奋起再战,还有些...

网友评论

      本文标题:ServerBootstrapAcceptor 作用

      本文链接:https://www.haomeiwen.com/subject/vojjpktx.html