文档章节

openfire connectionmanager源码分析

今幕明
 今幕明
发布于 2014/09/03 15:42
字数 522
阅读 304
收藏 0

服务器启动:
ConnectionManager
start()
startModules():
ServerSurrogate:可创建多个连接到业务服务器,把连接信息保存到map中
start():遍历map,测试到业务服务器的连接是否正常
SocketSendingTracker:
start():从SocketConnection中获取连接,检查连接状态
startClientListeners(),初始化mino的监听,设置filter:XMPPCodecFactory、StalledSessionsFilter(如果写的包大于5M就关闭连接)
绑定连接处理器:ClientConnectionHandler(extends ConnectionHandler)
startClientSSLListeners()
startHttpBindServlet()

服务器每次接收客户端发过来的数据可能不是一个完整的xml,XMPPCodecFactory中会进行处理,再到下面的处理就是正确的xml了

接收客户端发过来的协议:

ConnectionHandler
messageReceived():
StanzaHandler.process() 处理stream协议
ServerRouter.route()
ServerSurrogate.send()
在线程池中执行线程:RouteTask.run。
将当前线程转换为ConnectionWorkerThread,执行ConnectionWorkerThread.deliver()
上一步中的线程池是通过ConnectionsWorkerFactory创建的,所以才可以讲RouteTask转换为ConnectionWorkerThread
并且在创建线程的时候,将ConnectionWorkerThread保存到map中了。
创建ConnectionWorkerThread的时候,会创建到业务服务器的连接
这里每个线程对应一个到业务服务器的连接,由于线程是保存在线程池中的,所以线程不会销毁,到业务服务器的连接也不会中断
当线程不够用的时候,线程池自动创建新的线程,新的线程会再创建一个到业务服务器的连接,这样即使其中一个连接阻塞了也没关系。
ConnectionWorkerThread.deliver():这里将协议包装为route协议
SocketConnection.deliver()
接收业务服务器的数据:
ConnectionWorkerThread中连接到也业务服务器时,会设置XMPPPacketReader,然后构造一个ServerPacketReader,在ServerPacketReader中开线程处理来自业务服务器的数据
ProcessSessionQueueTask.run()或ProcessStanzaTask.run()
ServerPacketHandler.handle()
ServerPacketHandler.processRoute():根据streamid取出ClientSession
ClientSession.deliver()


客户端的连接是什么时候保存的呢?
StanzaHandler.process()
Stanzahandler.createSession
ClientStanzaHandler.createSession()
ClientSession.createSession()
Session.addSession()
streamid是创建客户端session时生成的,组装route协议时将streamid加上了,业务服务器返回协议中也有streamid,根据streamid找到Session,就可以将协议返回给客户端


本文转载自:http://blog.csdn.net/liuguxing/article/details/8082242

今幕明
粉丝 46
博文 229
码字总数 39350
作品 0
朝阳
程序员
私信 提问
聊聊jest的IdleConnectionReaper

序 本文主要研究一下jest的IdleConnectionReaper IdleConnectionReaper jest-common-6.3.1-sources.jar!/io/searchbox/client/config/idle/IdleConnectionReaper.java IdleConnectionReaper......

go4it
04/22
0
0
聊聊flink的ConnectionManager

序 本文主要研究一下flink的ConnectionManager ConnectionManager flink-release-1.7.2/flink-runtime/src/main/java/org/apache/flink/runtime/io/network/ConnectionManager.java Connecti......

go4it
02/26
0
0
如何在 apache commons-httpclient 4.2 中使用自定义的 DNS 解析

要想使 DefaultHttpClient 对象使用自定义的 DNS 解析(比如将 blogjava.net 关联到 127.0.0.1,使其访问 "http://blogjava.net" 时请求本地服务器),可以用下面的办法(我在官网上没找到相...

_mike
2012/11/12
0
2
怎么一步步编写简单的PHP的Framework(十八)

上一次我们把模型的驱动类实现了,由于ConnectionManager需要按照配置文件中配置的驱动名实例化驱动类,所以我们先在配置文件中加入驱动名: <?phpreturn array('defaultController' => 'In...

阳光test
2012/12/17
0
7
XMPP学习笔记-LESSON-007:XMPPServer.java之Plugin开发

网上关于openfire开发的文字非常多,在这里推荐一篇文章: http://redhacker.iteye.com/blog/1919329 openfire插件开发之完美开发 这是单独开发openfire插件的的一个实例。 不过我个人还是建议...

今幕明
2014/02/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ant 中的fileset include等拷贝

拷贝一个目录到指定目录下 例:<copy todir="${basedir}/new"> <fileset dir="${basedir}/old"> <include name="appgen" /> <include name="appgen/" /> <include name=appgen/**" /> <incl......

shzwork
9分钟前
1
0
react-jianshu项目的创建

创建项目 1、github上创建仓库react-jianshu 2、将项目克隆到本地git clone git@github.com:startjcu/react-jianshu.git 3、在当前目录(项目目录的上级目录)下执行create-react-app react-...

星闪海洋
19分钟前
2
0
OSChina 周二乱弹 —— 小哥哥,你可以教我写代码吗

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @nnnm: 生活大爆炸,结束了,这部陪伴了漫长时间的情景喜剧,最终是以诺贝尔奖和大团圆收尾的。虽然,不算精彩,但也是温馨。而少年谢尔顿的...

小小编辑
今天
235
11
typescript 接口 函数类型 可索引类型

函数类型 可索引类型 数字索引签名 字符串索引签名 数字索引签名返回值 必须是 字符串索引签名返回值的子集 只读索引签名

lilugirl
今天
3
0
Oracle SQL语法实例合集

如需转载请注明出处https://my.oschina.net/feistel/blog/3052024 目的:迅速激活Oracle SQL 参考:《Oracle从入门到精通》 ------------------------------------------------------------......

LoSingSang
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部