前言
为了观察undertow 线程管理机制,Servlet4.0 封装过程,决定对一个容器进行深度理解.
入口
从Undertow.start()开始
1.Xnio : 对标准SelectorProvider 和 ClassLoader 进行封装。
2.XnioWorker :基于Xnio封装创建。
2.1 XnioWorker.createWorker
创建一个 Selector 的接入请求线程。和于CPU线程数一样的Selector 其他事件进行监控。重点:并初始化一个 TaskPool.一个被封装过的ThreadPoolExecutor 默认保持60秒链接。并由这个线程池提供 ExchangeHandler 处理。
2.2 XnioWorker.WorkerThread
由WorkerThread,核心代码 selector.select(). 监听到需要 ExchangeHandler 的时间,交给TaskPool 进行处理。
3.ChannelListener 对SockeChannel 封装HttpHandler 到 QueuedNioTcpServer
4.唤醒 selector 开始所有工作
Selector 监听网络IO(QueuedNioTcpServer.acceptTask()让accept 线程继续). 把事件给到 分发给 Xnio进行二次分发 - 链接请求事件给到Accept线程 —> 再给到ioWorker -> 再给到TaskPool
总结
Xnio包含了核心线程, 链接事件线程, 分发线程,处理线程。
由IOWorker 进行链接封装包装 QueuedNioTcpServerHandle(依赖QueuedNioTcpServer)->ExchangeHandler ->SocketChannel.attachment 到TaskPool(一个标准ThreadPoolExecutor)








网友评论