`
java-mans
  • 浏览: 11422514 次
文章分类
社区版块
存档分类
最新评论

Openfire源码分析

 
阅读更多

Openfire源码分析

1. Openfire

Openfire是开源的实时协作服务器(RTC),它是基于公开协议XMPP(也成为Jabber)消息的。Openfire的核心功能可以概括为:连接管理、消息解析、消息路由、消息发送。

1.1 框架

Openfire核心功能由Module组成,上图中的各个模块绝大多数也是基于Module实现的。为了动态的管理这些Module,Openfire使用了自己的类加载器JiveClassLoader,这样就可以在不重新启动系统的前提下进行Module的安装、卸载和重新加载。

1.2 Module

Openfire在启动时就加载了所有的Module,这些Module提供了Openfire的核心功能。

所有Module都需要实现Module接口,该接口中定义了模块生命周期中需要调用的方法,如下图所示:

1.3 数据流

2. Openfire与MIMA

MINA是Apache组织下的一个项目,它可以帮助用户轻松的开发高性能和高扩展性的网络应用。MINA提供了一个抽象的、支持各种传输协议的(如TCP/IP、UDP/IP)、基于Java NIO的异步事件驱动的API。

Openfire的ConnectionHandler类继承了MINA的IoHandlerAdaper,他主要负责连接的创建、销毁,以及接收到XML数据包的投递。ConnectionHandler有三个子类,其中ClientConnectionHandler负责客户端与服务器端的连接,ComponentConnectionHandler负责组件与服务器端的连接。

3. Multi-User-Chat

多人聊天的消息是绑定在子域conference上的,对应的Component是MultiUserChatServiceImpl。在多人聊天中,涉及到的实体与关系有:用户、聊天室、用户与聊天室的关系,MultiUserChatServiceImpl就负责这些实体与关系的维护以及消息的投递。

3.1 MUCUser

MUCUser是参与群聊用户的一个抽象,用于与聊天服务器进行交互,比如发送和接收聊天信息。

3.2 MUCRole

定义了MUCRoom与MUCUser的关系。同一个MUCUser在不同的MUCRoom中可以有不同的角色。

3.3 MUCRoom

包含聊天室的基本信息及参与人、聊天记录等信息。

3.4 MultiUserChatServiceImpl

管理所有的聊天室,并负责消息的分发。

3.5 时序图

4. Pub-Sub

发布订阅消息是绑定在子域pubsub上的,对应的模块是PubSubModule。

4.1 Node

发布订阅系统中的虚拟节点,该节点可以接收或者发布各类信息或通知。在其他发布订阅系统中常被称为TOPIC。

CollectionNode可以包含子节点,子节点的类型可以是CollectionNode或者LeafeNode,该类型的节点不能作为发布订阅的目标节点;LeafeNode不能包含子节点,它可以作为发布订阅的目标节点。

4.2 NodeAffiliate

定义了用户与节点之间的关系,包括:ower、publisher、none、outcast。

4.3 NodeSubscription

一个用户可以订阅某个节点多次,每次订阅都使用不同的配置(比如过滤关键字不同),NodeSubscription就是描述这些订阅和配置的。如果一个消息满足用户的多个订阅,则只有一份消息被分发给该用户,而不是多个。

4.4 PubSubModule

PubSubModule负责节点的管理、发布订阅关系的维护、消息的分发。

4.5 PubSubEngine

负责处理发布订阅数据包。

4.6 时序图

5 插件开发

在Openfire中,插件可以直接使用所有的Openfire API,这为插件的功能提供了极大的灵活性。

5.1 注册为组件

注册一个插件作为一个组件,组件可以接收发送给特定子域的所有数据包。例如上述的组件MultiUserChatServiceImpl就可以接收到所有发送给conference子域的数据包。所有的组件由InternalComponentManager Module进行管理。

在TestPlugin的initializePlugin方法中初始化TestComponent实例,并调用InternalComponentManager将初始化的实例注册到目标子域名中,这样TestComponent组件就能接收到并处理发送到目标子域的消息。

5.2 注册为拦截器

注册一个组件为拦截器,那该组件可以接收所有的数据包,并且可以随意的抛弃他们。

在TestPlugin中的initializePlugin方法中初始化该组件,并调用InterceptionManager将该拦截器注册到全局拦截器中。这样所有的消息都会经由方法interceptPacket进行处理。

5.3 注册为IQHandler

将插件注册为IQHandler,则该插件关联命名空间的数据包将交予该插件进行处理。

在TestIQHandlerPlugin中的initializePlugin方法中,初始化TestIQHandler,并注册到IQRouter中。IQHandlerInfo中声明了该IQHandler处理的IQ消息的命名空间。

转自:I'm Bitiliu-《Openfire源码分析》

分享到:
评论

相关推荐

    openfire消息机制和源码分析

    openfire源码分析资料,本人参与公司openfire修改,以及二次开发,终于找到了比较全面的openfire资料;吐血推荐,是openfire分析,修改,二次开发不可多得的资料。内附详细源码分析以及二次开发的方法还有数据库表...

    openfire二次开发资料整理

    openfire源码分析资料,本人参与公司openfire修改,以及二次开发。2年多openfire经验总结,吐血推荐,是openfire分析,修改,二次开发不可多得的资料。内附详细源码分析以及二次开发的方法还有数据库表结构的详细...

    关于Openfire集群源码的分析

    主要介绍了关于Openfire集群源码的分析,内容比较详细,具有一定参考价值,需要的朋友可以了解下。

    Android推送框架 androidpn

    Androidpn推送框架源码分析及配置方法,压缩包里面包括服务端和客户端代码,及说明文档

    Android应用源码安卓源码(172个合集).zip

    Android模仿乐淘的应用程序分析源码.zip Android游戏源码——忍者快跑.rar Android自动发送短信.rar Android自动开关机实现.rar Android视频采集+RTSP完整代码(可用) Android远程登录含有loading登录效.zip Angle ...

    JAVA上百实例源码以及开源项目源代码

    Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来...

    log-analysis-kafka-storm-docker:在Docker中运行的Kafka,Storm,Zookeeper和Openfire

    ##下载源码git clonekafka-log-appender:将日志内容写到kafka程序log-kafka-storm:docker-compose脚本和storm程序##准备docker环境###启动dockerdocker-compose环境搭建过程请查看我的进入log-kafka-storm目录,...

    JAVA上百实例源码以及开源项目

    笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!此时此...

    java开源包8

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包1

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包11

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包2

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包3

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包6

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包5

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包10

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

Global site tag (gtag.js) - Google Analytics