文档章节

tigase内部处理(1):启动

greki
 greki
发布于 2014/06/06 16:57
字数 783
阅读 971
收藏 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 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
XMPP服务tigase配置流程

下载jdk,我使用的是1.8版本的。 下载tigase包,我使用tigase-server-5.2.1-b3461-dist-max.tar,这个包,在JDK1.6 上,运行不起来。需要在1.7以上。 解压缩包, $ unzip tigase-server-x.y....

淡风
2014/04/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Confluence 6 修改导航显示选项

选择 子页面(Child pages)来在边栏中查看当前页面的子页面。 选择 页面树(Page tree)来查看整个空间的页面树,扩展当前的页面。 你也可以选择是否完全隐藏导航显示选项或者添加你希望可见...

honeymose
20分钟前
0
0
Ubuntu18.04 安装MySQL

1.安装MySQL sudo apt-get install mysql-server 2.配置MySQL sudo mysql_secure_installation 3.设置MySQL非root用户 设置原因:配置过程为系统root权限,在构建MySQL连接时出现错误:ERROR...

AI_SKI
今天
3
0
3.6 rc脚本(start方法) 3.7 rc脚本(stop和status方法) 3.8 rc脚本(以daemon方式启动)

3.6-3.7 rc脚本(start、stop和status方法) #!/usr/bin/env python# -*- coding: utf-8 -*-# [@Version](https://my.oschina.net/u/931210) : python 2.7# [@Time](https://my.oschina.......

隐匿的蚂蚁
今天
3
0
Cnn学习相关博客

CNN卷积神经网络原理讲解+图片识别应用(附源码) 笨方法学习CNN图像识别系列 深度学习图像识别项目(中):Keras和卷积神经网络(CNN) 卷积神经网络模型部署到移动设备 使用CNN神经网络进行...

-九天-
昨天
5
0
flutter 底部输入框 聊天输入框 Flexible

想在页面底部放个输入框,结果键盘一直遮住了,原来是布局问题 Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("评论"), ...

大灰狼wow
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部