博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Netty源码-ServerBootStrap服务端启动流程
阅读量:6064 次
发布时间:2019-06-20

本文共 1151 字,大约阅读时间需要 3 分钟。

hot3.png

001654_9Nrb_2852872.png

Netty ServerBootStrap服务端启动流程

注意阅读顺序,正常是从左到右,然后从上到下,注解说明了一些比较重要的东西

1.设置NioServerSocketChannelFactory,

1.1 初始化 bossExecutor

1.2 初始化 workerExecutor(服务端启动过程中,并没有用到)

1.3 初始化 ChannelSink ( NioServerSocketChannelSink)

2.设置ChannelPipeLineFactory

2.1 通过多个ChnnelHander组装ChannelPipeline

2.2 通过ChannelPipeline 初始化ChannelPipelineFactory 

3. bind一个ip地址,调用ServerBootStrap.bind方法,返回NioServerSocketChannel

通过了一个阻塞队列与ChannelFuture,实现异步的控制是否启动成功

3.1 创建一个带有Binder处理器的channelPipeline,

3.2 通过1中初始化的channelFactory           创建一个NioServerSocketChannel

返回的NioServerSocketChannel as channel组合了java.nio.channels.ServerSocketChannel as NativeChannel,在new channel的时候,看到了熟悉的原生初始化NativeChannel的代码

3.2.1 执行了 Channels.fireChannelOpen()方法,触发ChannelState.OPEN事件,执行Channel的pipeline链的upstreamHandler,这个时候只有一个即Binder

3.2.2 Binder重写了channelOpen方法,并在这个方法里面调用了Channel的bind方法,这个方法会触发1.3中配置的ChannelSink中的eventSunk方法,并最终调用NioServerSocketChannel.socket.socket().bind(ip)这个实际的函数,并通过DeakLockProofWorker启动一个Boss线程,最后触发Channel.BOUND事件。

在Boss线程中,我又看到了熟悉的原生的NIO的东东,初始化Selector,注册serverChannel感兴趣的Accept事件,并启动for(;;)循环,接受SocketChannel,但是处理方式与便利SelectKeys貌似不太一样,继续看

转载于:https://my.oschina.net/baoyuexing/blog/756588

你可能感兴趣的文章
hadoop命令大全
查看>>
oracle merge
查看>>
js中document对象的属性与方法
查看>>
在Android中调用动态库文件(*.so)
查看>>
医疗诉讼需要准备的材料!
查看>>
zabbix4.0 web页面title个性修改
查看>>
金业能源科技的汽车消耗能源解决对策
查看>>
while((ch = getchar()) != '\n')
查看>>
Redhat安装*.jar软件包(二)
查看>>
nginx.conf
查看>>
为什么您不应该以管理员身份运行计算机
查看>>
【干货】前方高能!如何保障Python应用的高性能
查看>>
使用cwRsync同步静态资源
查看>>
使用 mysqlbinlog恢复数据
查看>>
总结六:Linux文件系统之文件管理命令
查看>>
我的友情链接
查看>>
SCCM2016 Boot Configuration Data(BCD) 不包含可用的OS
查看>>
Exchange DAG架构的灾难恢复(二)
查看>>
Windows Server 2012 R2 DNS相关文件部分教程
查看>>
我的友情链接
查看>>