文档章节

tigase代码框架解读

今幕明
 今幕明
发布于 2014/09/10 11:34
字数 1082
阅读 256
收藏 0

摘要: 在java下实现的xmpp开源实现,除了openfire外,tigase是另一个牛逼的项目。实际的实验室压力下,50万人同时在线的单 机,tigase的gc情况要优于openfire,而且openfire的网络层代码借鉴了不少tigase的。下面的内容,在解...

                           

  • 在java下实现的xmpp开源实现,除了openfire外,tigase是另一个牛逼的项目。

  • 实际的实验室压力下,50万人同时在线的单机,tigase的gc情况要优于openfire,而且openfire的网络层代码借鉴了不少tigase的。

下面的内容,在解剖tigase过程中所写,使用的版本是:5.2.1 (2014年7月份)。

组件

tigase就是一个大组件框,里面所有东西基本都是组件组成的。session manager、message router、c2s connection manager…全部是组件。

ServerComponent接口是一个最小化接口,但是要去写很多代码,tigase提供了许多的现成的代码,减少去从零实现这个接口的过程。

比 如extends AbstractMessageReceiver可以直接生成一个处理消息的组件。只需要实现一个processPacket方法。实现 getDefaults方法,可以对系统变量进行处理。实现setProperties方法,可以去设置一些要用的变量。

多线程

processPacket方法,可以把逻辑扔到不同的cpu上去运行,以发挥服务器多核的优势。processingThreads方法返回用多少个cpu来处理。

在重写processingThreads的同时,需要重写hashCodeForPacket方法,确保同一个用户的数据,在同一个cpu上处理,以确保不出现消息乱序。

定时器

可以重写everySecond everyMinute everyHour的逻辑,以达到定时器的作用。

还可以重写另外两个方法来指定固定时间完成的任务:

addTimerTask(TimerTask task, long delay, TimeUnit unit);

addTimerTask(TimerTask task, long delay);

重写initializationComplete方法,tigase会在特定的时间里来调用,具体说,就是在所有准备工作做完了后,多半这里用来启动连接之类的。

统计信息

复写getStatistics,用StatisticsList来保存统计信息。

组件的生命周期

一个组件按照下面的过程被调用:

  • 组件被加载,使用无参的public构造函数创建一个实例。

  • setName

  • start

  • getDefaults

  • setProperties

  • initializationCompleted 最后被调用,一般用来启动socket连接。

ConnectionManager

ConnectionManager是继承自AbstractMessageReceiver(前面的可以省去代码的组件实现方式)的抽象类,比如c2s组件就是继承了它。

如 果你extend这个类,你需要知道数据来源于哪里:如果来源于MessageRouter,那么abstract void processPacket(Packet packet)方法会被调用; 如果来源于网络连接,那么abstract Queue processSocketData(XMPPIOService serv)方法会被调用。

架子

  • ComponentRegistrator:本身是一种组件,专用于注册各种组件。registr –> addComponent

  • MessageReceiver:本身是一种组件,专用于收消息。也叫Router,因为消息内容在此类组件中流动。

  • XMPPService:本身是一种组件,专用于显示serviceDiscovery时的名称啥的。大作用没有。

  • AbstractMessageReceiver:高级一点的组件,基于MessageReceiver、XMPPService,同时实现了很多细节,还搞了多个线程搞收和发。

启动

  • messageRouter的setConfig,进入ConfiguratorAbstract-AbstractComponentRegistrator的addComponent。

  • 再回到ConfiguratorAbstract的componentAdded,然后是setup(component)。

  • component.setProperties进入messageRouter的setProperties。

  • comp.initializationCompleted()启动了connectionManager的各种socket。

网络

  • connectionManager同时协调ConnectionOpenThread与SocketThread。

  • ConnectionOpenThread脱离上述组件,属于网络层实现,操作selector。它负责Selector.open。

  • IOService提供线程安全的call方法,XMPPIOService继承它,保存了连接信息,每个连接一个IOService。

  • SocketThread在实例化时,会启动多个线程,同时盯住selector。负责将每个确定的IOService进行数据处理。

  • 实现ConnectionOpenListener接口accept方法接收SocketChannel,组装IOService,交由SocketThread处理。

  • ConnectionManager用ConcurrentHashMap记录了所有的连接。

零碎

  • AbstractMessageReceiver.addPacket 往自己的in_queue里加数据,是阻塞的,如果满了会出事。

  • AbstractMessageReceiver.addPacketNB 往自己的in_queue里加数据,非阻塞的,和上一个的区别在于,一个是put一个是offer到queue。

  • AbstractMessageReceiver.addPackets 来一堆数据。

  • 所有in_queue里的数据,会被processPacket方法所处理。

  • 对应有addOutPacket。

  • 所有out_queue里的数据,都默认扔给parent的in_queue,没有parent就扔到自己的in_queue。

  • 所有in_queue的数据,都由processPacket具体的实现来处理。


本文转载自:http://it.taocms.org/07/3964.htm

今幕明
粉丝 47
博文 230
码字总数 39350
作品 0
朝阳
程序员
私信 提问
Tigase输出从客户端和服务器的请求应答日志

http://chutianxing.wordpress.com有些中文翻译文章,不过需要翻墙访问 Tigase改装目标 把Tigase迁移到DAF是我们的目标。DAF(Datou Application Framework)是手机大头的服务器集群应用开发...

greki
2014/03/19
2.2K
0
tigase server 在eclipse启动调试

1.git clone 项目代码 https://repository.tigase.org/git/tigase-server.git 2.eclispe 导入工程 注意:5.2后要用jdk7,不然编译错误 3.配置启动 用java application 调试,配置调试 Main C...

greki
2014/03/19
2.3K
0
Tigase组件第一节 – 概述和基础信息

本文翻译自 - http://www.tigase.org/content/component-implementation-lesson-1-basics Tigase组件是一个具有jid的实体。它可以接受/处理也可以产生packet。 举一些大家都知道的组件:MUC...

greki
2014/03/19
655
0
搭建Tigase jaxmpp使用

假设本机已经成功安装了MySQL数据库 A:搭建Tigase 官方安装文档:http://www.tigase.org/content/manual-installation-console-mode 1:下载架包并解压缩 /usr/local/tigase-server-5.1.4-b...

丁佳辉
2016/06/08
207
0
Tigase XMPP Server源码部署

1相关文档 Tigase官网:http://www.tigase.org 开发指南:http://www.tigase.org/devel-guide Eclipse下部署Tigase源码:Hack Tigase Jabber/XMPP Server in Eclipse Tigase5.2版本以后使用了......

蛙牛
2014/04/29
5.7K
1

没有更多内容

加载失败,请刷新页面

加载更多

安全组和云防火墙的区别

前言 熟悉云平台的朋友可能都会注意到这样一个事情:无论公有云还是私有云,创建虚拟机的时候都需要选择安全组,来对虚拟机进行安全防护;有的云平台在VPC里,还能选择防火墙,ZStack在3.6版...

ZStack社区版
28分钟前
2
0
教育性app开发的重要性和好处

在这个精通技术的世界中,流行的app主导着无聊的教育系统。当我们将技术和教育结合在一起时,它将带来当代以及强大的学习资源。因此,将教育移动app集成到您的学习过程中,并根据自己的信念把...

a429011717
29分钟前
3
0
IE6/7/8如何兼容CSS3属性

本文转载于:专业的前端网站➩IE6/7/8如何兼容CSS3属性 最近在工作中总是要求IE8兼容CSS3属性,在网上搜了搜主要是引入了一个htc文件(ie-css3.htc或者PIE.htc。个人认为这两个文件的作用差不...

前端老手
44分钟前
3
0
手把手教你ALLEGRO的约束规则的设置教程!

约束规则的设置 分三步, 定义规则(一、基本约束规则设置:1、线间距设置;2、线宽设置;3、设置过孔;4、区域约束规则设置;5、设置阻抗;6、设置走线的长度范围;7、设置等长:7.1、不过电阻的NET 等...

demyar
46分钟前
4
0
完美解决H5滚动滑动穿透方案:不使用系统滚动

网上有很多黑科技解决这个问题,都不是从根本去解决,例如通过js控制弹出时html加上position:fixed; 弹窗关闭后再去掉该样式,总觉得不太对,像是打补丁。 今天终于找到了滚动穿透的原因和完...

未来cc
50分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部