tigase服务端启动分析(一)
1.启动 入口:XMPPServer.start(),关键源码如下:
1.1 MessageRouter.setConfig(config) 主要任务就是初始化组件,把组件按名字和对绑定到相关的变量里,为后面xmpp packet路由做准备;
addRegistrator()
addComponent(registr)
registr.addComponent(comp)
componentAdded((E) component);调用setup方法
1.getDefConfigParams()
通过[BasicComponent和ConfigaratorAbstract].getDefaults 获取初始化默认参数列表 ,添加感兴趣的属性。 MessageRouter与registr在执行getDefaults不同的是,他还有获取AbstractMessageReceive的成员变量信息。添加了队列的相关信息。
在通过 MessageRouterConfig.getDefaults(defs, params, getName())设置MessageRouter配置信息。
2.component.setProperties
BasicComponent和ConfigaratorAbstract的setProperties方法,设置组件成员变量:如:compId、defHostname、admins、commandsACL等,并loadScripts。此过程主要是通过加载、过滤参数列表,初始化话registr组件。
1.2 MessageRouter.setProperties的初始化
packet在组件中是怎么处理的,packet有个from和to属性,包在组件间的路由主要根据TO属性来判断有谁来处理这个packet
1、包处理关系 ServerComponent mr if (mr instanceof MessageReceiver) { //把message-router设置为他的上级服务器组件 ((MessageReceiver) mr).setParent(this); //MessageReceiver启动处理component的in和out的 ((MessageReceiver) mr).start(); QueueListener处理线程,监听 AbstractMessageReceiver的in和out的packet_queue
2、如果是messagerReceiver添加到组件的路由
3.组件初始化完毕处理
c2s是怎么接收client发送过来的tcp的包和处理的
最终会启动负责读写的socketReadThread和socketWriteThread及ResultsListener线程; 报文的接收和发送是通过nio实现;用户的socketChannel是被对象socketIO持有,再被IOService【集成了Callable】持有,再被放到selectionKey里; socketThread线程在收到报文后,selectionKey的IOService放到forCompletion的列表里, 在统一被completionService.submit(serv),调用XMPPIOService的call方法进行内部的packet处理; ResultsListener负责处理处理完毕的IOService;
对于packet在tigase的内部处理 ,基本上都是线程+队里的处理方式。
1.3 router.start()启动
主要调用了AbstractMessageReceiver.startThreads();启动了router组件的in和out线程,处理由QueueListener的run来处理; 收到queue里的packet,根据packet.to属性获的来处理该packet的component,交它处理
__EOF__
本文链接:https://www.cnblogs.com/veblen/p/14703581.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!