文档章节

tigase内部处理(1):启动

greki
 greki
发布于 2014/06/06 16:57
字数 783
阅读 966
收藏 2

1.启动

参考:http://my.oschina.net/greki/blog/209928

入口:XMPPServer.start(),关键源码如下:

router = (MessageRouterIfc) Class.forName( mr_class_name ).newInstance();
router.setName( serverName );
router.setConfig( config );//初始化配置
router.start();//启动

1.1.MessageRouter.setConfig(config)

主要任务就是初始化组件,把组件按名字和对绑定到相关的变量里,为后面xmpp packet路由做准备;

components.put(getName(), this);//将自己添加到自己的components成员变量
this.config = config;//将config赋值给自己的成员变量
config.addRegistrator(config);//config注册到自己的成员变量registrators

--->addRegistrator()

registrators.put(registr.getName(),registr);//1.registr注册到MessageRouter的registrators
addComponent(registr);//2.registr注册到MessageRouter的components和components_byId
for (ServerComponent comp : components.values()) {
  registr.addComponent(comp);//3
}
--------->2:addComponent(registr)
for (ComponentRegistrator registr : registrators.values()) {
	if (registr != component) {
		registr.addComponent(component);
	}
}      
components.put(component.getName(), component);
components_byId.put(component.getComponentId(), component);
if (component instanceof XMPPService) {
      xmppServices.put(component.getName(), (XMPPService) component);
}

--------------->3:registr.addComponent(comp)

if (isCorrectType(component)) {
	components.put(component.getName(), (E) component);
	componentAdded((E) component);
	return true;
} else {
	return false;
}

----------------------->4: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组件。

     每个component的初始化方法就是component.setProperties

1.2.MessageRouter.setProperties的初始化

这里可以帮助我理解packet在组件中是怎么处理的,packet有个from和to属性,包在组件间的路由主要根据TO属性来判断有谁来处理这个packet

1.这里有2个对后面包处理关系比较的

ServerComponent mr
if (mr instanceof MessageReceiver) {
  ((MessageReceiver) mr).setParent(this);//把message-router设置为他的上级服务器组件
   ((MessageReceiver) mr).start();  //MessageReceiver启动处理component的in和out的QueueListener处理线程,监听AbstractMessageReceiver的in和out的packet_queue

2.如果是messagerReceiver添加到组件的路由

if (mr instanceof MessageReceiver) {
	addRouter((MessageReceiver) mr);
} else {
	addComponent(mr);
}

3.组件初始化完毕处理

for (ServerComponent comp : components.values()) {
	comp.initializationCompleted();
}

4.特别说明下clientConnectionManager.initializationCompleted()处理;

追踪了下,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的内部处理,到时候在起一篇文章整理下;基本上都是线程+队里的处理方式)

可以先看下http://my.oschina.net/greki/blog/209588

1.3.再看看router.start()启动

主要调用了AbstractMessageReceiver.startThreads();启动了router组件的in和out线程,处理由QueueListener的run来处理;

收到queue里的packet,根据packet.to属性获的来处理该packet的component,交它处理


packet=queue.take()
message_router.processPacket(packet){
compent comp = getLocalComponent(packet.getTo());
compent.processPacket(packet)


© 著作权归作者所有

共有 人打赏支持
greki
粉丝 98
博文 109
码字总数 45236
作品 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
79
0
Tigase组件第一节 – 概述和基础信息

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

greki
2014/03/19
0
0
linux tigase (IM服务器)安装

官方指导:http://www.tigase.org/content/manual-installation-console-mode 安装的为derby db,有人说是个内存数据库(也不是,数据会保留到磁盘) 1 下载安装包 https://projects.tigase....

greki
2014/03/10
0
5
Tigase输出从客户端和服务器的请求应答日志

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

greki
2014/03/19
0
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
0
1

没有更多内容

加载失败,请刷新页面

加载更多

20.27 分发系统介绍~ 20.30 expect脚本传递参数

分发系统介绍分发系统-expect讲解(也就是一个分发的脚本)场景:业务越来越大,网站app,后端,编程语言是php,所以就需要配置lamp或者lnmp,最好还需要吧代码上传到服务器上;但是因...

洗香香
17分钟前
1
0
设计一个百万级的消息推送系统

前言 首先迟到的祝大家中秋快乐。 最近一周多没有更新了。其实我一直想憋一个大招,分享一些大家感兴趣的干货。 鉴于最近我个人的工作内容,于是利用这三天小长假憋了一个出来(其实是玩了两...

crossoverJie
23分钟前
1
0
软件架构:5种你应该知道的模式

Singleton(单例模式)、仓储模式(repository)、工厂模式(factory)、建造者模式(builder)、装饰模式(decorator)……大概每个上课听讲的程序员都不会陌生——软件的设计模式为我们提供...

好雨云帮
35分钟前
2
0
OSChina 周二乱弹 —— 这只是一笔金钱交易

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《暮春秋色》- 窦唯 / 译乐队 《暮春秋色》- 窦唯 / 译乐队 手机党少年们想听歌,请使劲儿戳(这里) @我没有抓狂:跨服聊...

小小编辑
47分钟前
405
14
df命令、du命令 、磁盘分区

9月25日任务 4.1 df命令 4.2 du命令 4.3/4.4 磁盘分区 4.1、命令 :df #磁盘空间使用情况 [root@zgxlinux-02 ~]# df 按字节显示 1000Byte=1KB 1000KB=1MB 1000MB=1GB ...

zgxlinux
55分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部