Netty服务启动流程
2023-09-14 22:53:25 12 举报
Netty服务启动流程
作者其他创作
大纲/内容
TailContext
如果没有完成,注册一个监听器,完成后来回调
MultithreadEventLoopGroup#register
不需要
//配置反射工厂的构造器 = NioServerSocketChannel的空构造器bootstrap.channel(NioServerSocketChannel.class)
doRegister()
结束
eventLoop.execute
.register(channel)
@Override public void initChannel(final Channel ch) { 省略具体代码... } }
doBind
init(channel)
创建ServerSocketChannelPipeline
doBind0 继续做绑定
findContextInbound
invokeChannelRegistered()
group
这里比如从boss线程组中获取一个EventLoop执行,因为服务端boss线程配置为1,这里其实就是单线程去执行
不是
ChannelInitializer
获取next.handler
invokeHandler()
regFuture.isDone()
追溯到
当前线程是不是EventLoop自己
判断channel的注册到EventLoop是否成功完成,这里指的是serverSocketChannel
newSocket
检查channel状态记录首次注册
如果完成
bootstrap.bind(9000)
NioServerSocketChannel()
通知Pipeline中的ChannelHandler,Channel已经注册。
ServerBootstrap
HeadContext
确保所有关于通道的操作都在其关联的EventLoop线程中执行,这是Netty为了线程安全而采用的策略
if (invokeHandler())当前handler是否需要执行
config().group()
Task
new Runnable() { @Override public void run() { register0(promise); }}
fireChannelRegistered()
为新创建的channel设置选项和属性
AbstractChannel.AbstractUnsafe#register
childGroup
设置感兴趣的事件(OP_ACCEPT)
if (isActive())
设置非阻塞模式
this
绑定服务器端口9000并启动
看不懂可以参考EventLoop创建的流程图
为ChannelPipeline添加ChannelInitializer
1. Channel注册到其EventLoop的Selector上2. selectionKey 这个键可以用来更改要监听的事件,或者检查哪些事件已经触发
pipeline.fireChannelRegistered()
next()
创建ServerSocketChannel
尚未接受任何客户端连接,因此这里刚开始通道还没有活跃
runAllTasks()方法获取到这个Task执行register0
需要
channelFactory.newChannel()
initAndRegister
.register(channel)
register0(promise)
SingleThreadEventLoop#register
是
0 条评论
下一页