openfire开发文档Word文件下载.docx

上传人:b****4 文档编号:16678235 上传时间:2022-11-25 格式:DOCX 页数:39 大小:1.45MB
下载 相关 举报
openfire开发文档Word文件下载.docx_第1页
第1页 / 共39页
openfire开发文档Word文件下载.docx_第2页
第2页 / 共39页
openfire开发文档Word文件下载.docx_第3页
第3页 / 共39页
openfire开发文档Word文件下载.docx_第4页
第4页 / 共39页
openfire开发文档Word文件下载.docx_第5页
第5页 / 共39页
点击查看更多>>
下载资源
资源描述

openfire开发文档Word文件下载.docx

《openfire开发文档Word文件下载.docx》由会员分享,可在线阅读,更多相关《openfire开发文档Word文件下载.docx(39页珍藏版)》请在冰豆网上搜索。

openfire开发文档Word文件下载.docx

2.3.5时序图16

2.4Pub-Sub16

2.4.1Node16

2.4.2NodeAffiliate17

2.4.3NodeSubscription17

2.4.4PubSubModule17

2.4.5PubSubEngine18

2.4.6时序图18

2.5插件开发19

2.5.1注册为组件19

2.5.2注册为拦截器19

2.5.3注册为IQHandler20

2.6命名规则21

2.6.1XXStarter21

2.6.2XXListener21

2.6.3XXDispatcher21

2.6.4XXPlugin21

2.6.5XXProvider21

2.6.6XXHandler22

2.7系统配置项22

2.8系统启动流程23

2.9网络处理23

2.9.1presence(出席状态)消息处理流程23

2.9.2消息监听服务25

2.9.3消息封装25

2.9.4Openfire消息包接受处理流程26

2.10数据库处理27

2.10.1Openfire连接数据库修改27

2.10.2ConnectionProvider27

2.10.3处理方式27

2.10.4常用类27

3Openfire插件开发流程28

3.1OpenfirePlugins加载流程28

3.2开发说明28

3.2.1总体插件目录结构29

3.2.2编写Plugin.xml29

3.2.3继承Plugin接口32

3.2.4插件开发的最优方法33

3.2.5JSP页面配置步骤33

3.2.6i18n国际化配置36

3.2.7Antbuild插件37

4Openfire的Cache机制38

4.1实现机制38

1Openfire项目工程搭建及调试

Openfire的最新源码3.7.1下源码的运行及打包

1.1准备工作

开发工具:

Eclipse 

  源码下载:

官网地址http:

//www.igniterealtime.org/downloads/source.jsp,当前最新版本为3.7.1。

1.2解压源码

  将源码解压到硬盘上。

如图:

1.3创建工程

  1、eclipse重启后新建一个JavaProject 

  2、在对话框的Projectname中输入工程名;

选中Createprojectfromexistingsource项;

在Directory中输入源码的路径(此值与第一个图的地址是相同的)。

  3、点击Finish,eclipse会将源码列出。

1.4编译

1、[Window]-->

[ShowView]-->

[Ant] 

  2、在Ant视窗中点右键,选择[AddBuildfiles...]。

如图 

  3、在打开的对话框中选择Openfire/build/build.xml后点[OK]按钮。

  4、点击openfire[default],直到出现buildsuccessfull。

  5、按上面相同的方法编译plugins。

1.5配置调试与运行环境

  1、当全部编译完成后,在PackageExplorer视窗中按[F5]键以更新目录结构。

此时在目录中会添加两个新的结点。

  2、打开工程属性对话框,JavaBuildPath/Libraries页面,点击[AddJARs...],将Openfire/target/openfire/lib下面的所有jar文件添加进来。

  3、[Run]-->

[OpenRunDialog...]打开对话框。

  4、Main页面。

在Project选项中点击[Browse...]按钮,选择Openfire。

在Mainclass选项中点击[Search...]按钮,在打开的对话框中输入ser后,选择ServerStarter双击。

如下图:

  设置结果如下图:

  5、Arguments页面。

在VMarguments中加下内容-DopenfireHome="

${workspace_loc:

Openfire}/target/openfire"

  6、Classpath页面。

选中UserEntries,点击[Advanced...],在打开的对话框中选择AddFolders,点[OK],在打开的对话框中选择Openfire/src/i18n双击。

  按照上面的方法将Openfire/src/resources也添加进来。

最后的结果如图:

  7、Common页面。

选择Run、Debug。

  8、点击[Apply]保存,再点[Run]在开发环境运行Openfire。

1.6打包发布

  安装Install4j后,Ant视窗中对Installer进行Build就Ok了。

只是要配置DefaultVMArguments的内容为-Xms64m-Xmx512m。

2Openfire代码框架介绍

Openfire是开源的实时协作服务器(RTC),它是基于公开协议XMPP(也成为Jabber)消息的。

Openfire的核心功能可以概括为:

连接管理、消息解析、消息路由、消息发送。

2.1框架

Openfire核心功能由Module组成,上图中的各个模块绝大多数也是基于Module实现的。

为了动态的管理这些Module,Openfire使用了自己的类加载器JiveClassLoader,这样就可以在不重新启动系统的前提下进行Module的安装、卸载和重新加载。

2.1.1Module

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

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

2.1.2数据流

2.2Openfire与MIMA

MINA是Apache组织下的一个项目,它可以帮助用户轻松的开发高性能和高扩展性的网络应用。

MINA提供了一个抽象的、支持各种传输协议的(如TCP/IP、UDP/IP)、基于JavaNIO的异步事件驱动的API。

Openfire的ConnectionHandler类继承了MINA的IoHandlerAdaper,他主要负责连接的创建、销毁,以及接收到XML数据包的投递。

ConnectionHandler有三个子类,其中ClientConnectionHandler负责客户端与服务器端的连接,ComponentConnectionHandler负责组件与服务器端的连接。

2.3Multi-User-Chat

多人聊天的消息是绑定在子域conference上的,对应的Component是MultiUserChatServiceImpl。

在多人聊天中,涉及到的实体与关系有:

用户、聊天室、用户与聊天室的关系,MultiUserChatServiceImpl就负责这些实体与关系的维护以及消息的投递。

2.3.1MUCUser

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

2.3.2MUCRole

定义了MUCRoom与MUCUser的关系。

同一个MUCUser在不同的MUCRoom中可以有不同的角色。

2.3.3MUCRoom

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

2.3.4MultiUserChatServiceImpl

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

2.3.5时序图

2.4Pub-Sub

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

2.4.1Node

发布订阅系统中的虚拟节点,该节点可以接收或者发布各类信息或通知。

在其他发布订阅系统中常被称为TOPIC。

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

LeafeNode不能包含子节点,它可以作为发布订阅的目标节点。

2.4.2NodeAffiliate

定义了用户与节点之间的关系,包括:

ower、publisher、none、outcast。

2.4.3NodeSubscription

一个用户可以订阅某个节点多次,每次订阅都使用不同的配置(比如过滤关键字不同),NodeSubscription就是描述这些订阅和配置的。

如果一个消息满足用户的多个订阅,则只有一份消息被分发给该用户,而不是多个。

2.4.4PubSubModule

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

2.4.5PubSubEngine

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

2.4.6时序图

2.5插件开发

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

2.5.1注册为组件

注册一个插件作为一个组件,组件可以接收发送给特定子域的所有数据包。

例如上述的组件MultiUserChatServiceImpl就可以接收到所有发送给conference子域的数据包。

所有的组件由InternalComponentManagerModule进行管理。

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

2.5.2注册为拦截器

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

在TestPlugin中的initializePlugin方法中初始化该组件,并调用InterceptionManager将该拦截器注册到全局拦截器中。

这样所有的消息都会经由方法interceptPacket进行处理。

2.5.3注册为IQHandler

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

在TestIQHandlerPlugin中的initializePlugin方法中,初始化TestIQHandler,并注册到IQRouter中。

IQHandlerInfo中声明了该IQHandler处理的IQ消息的命名空间。

2.6命名规则

Openfire中常见的类名后缀命名包括Starter、Plugin、Listener、Dispatcher、Handler、Manager、Provider,通常情况下,这些命名类包括如下意义:

2.6.1XXStarter

系统启动类,如org.jivesoftware.openfire.starter.ServerStarter,调用其start()方法可启动系统应用。

2.6.2XXListener

业务的最终处理类。

2.6.3XXDispatcher

调度类,其中有很多关键方法,如addListener(),以组合的方式,为类内定义的静态Set<

XXListener>

实例添加XXListener对象。

以便调用dispatchEvent(Stringproperty,EventTypeeventType,Map<

String,Object>

params)方法遍历处理Set集中的XXListener对象(通过调用XXListener对象的各实际方法完成实际业务)。

2.6.4XXPlugin

实现Plugin接口的插件类,需实现initializePlugin(PluginManagermanager,FilepluginDirectory)方法和destroyPlugin()方法。

在其初始化方法中调用Dispatcher实现类的addListener()方法如PropertyEventDispatcher.addListener(this)。

2.6.5XXProvider

实现面向接口编程方式的接口类,通过反射机制创建具体实现类的对象,反射类名配置在ofproperty表对应的记录propvalue属性中。

若没有相关配置,则调用默认实现类,默认实现类类名命名规则为DefaultXXProvider。

2.6.6XXHandler

实际处理类,以ConnectionHandler为例,在org.jivesoftware.openfire.spi.ConnectionManagerImpl类的startClientSSLListeners(StringlocalIPAddress)方法中,有这样一段代码:

sslSocketAcceptor.bind(newInetSocketAddress(bindInterface,port),newClientConnectionHandler(serverName));

其中bind方法的第二个参数是新创建的一个ClientConnectionHandler的实例,而它就是ConnectionHandler的一个子类。

2.7系统配置项

Openfire的系统配置项采用文件结合数据库表的方式配置,也有部分默认配置项通过Java硬编码方式配置(如org.jivesoftware.openfire.ConnectionManager接口类中定义的DEFAULT_PORT、DEFAULT_SSL_PORT、DEFAULT_COMPONENT_PORT等),Openfire中比较重要的配置位置包括:

一、src/conf目录下的openfire.xml配置文件。

该配置文件为系统核心配置文件。

在第一次启动Openfire并通过管理控制台完成安装配置后会往该配置文件中填入相应的配置信息。

二、plugin.xml配置文件。

该配置文件为各插件包下的核心配置文件,由它确定插件核心处理类和相应页面插件的展现等。

配置项及含义详见官方插件开发说明部分。

三、web.xml和web-custom.xml配置文件。

用于配置servlet和用户自定义servlet(插件页面用,放在插件对应目录下)。

四、ofproperty中的各条记录,该表中包括两个字段name和propvalue,分别代表配置项名和配置项值。

2.8系统启动流程

系统启动时调用ServerStarter类中的start()方法,通过反射加载org.jivesoftware.openfire.XMPPServer类文件,创建实例时调用其构造函数,在其构造函数中调用其start()方法实际启动服务应用程序。

Start()方法中首先调用verifyDataSource()方法验证并确保数据库可以访问,然后会调用loadModules();

initModules();

startModules();

方法来对Module接口的实现类的各子类进行操作,依次完成模块的加载、初始化和启动操作。

loadModules()方法中会调用loadModule(Stringmodule)方法通过反射加载各模块类,参数字符串module为对应的模块核心处理类的类名,如AdHocCommandHandler。

现以AdHocCommandHandler为例对接下来的处理流程进行说明。

通过loadModule创建AdHocCommandHandler类实例时调用其构造函数,在构造函数中初始化了其私有AdHocCommandManager对象。

在initModules()时调用AdHocCommandHandler实例的initialize(XMPPServerserver)方法对其私有属性对象进行初始化。

然后调用start()方法,调用addDefaultCommands方法添加命令并启动命令(通过调用startCommand(AdHocCommandcommand)方法实现)。

2.9网络处理

2.9.1presence(出席状态)消息处理流程

Presence处理是IMServer的核心,也是一个IMServer最复杂的部分。

一个用户的状态发生变化,需要通过服务器自动投递给他所有在线的好友,因此Presence模块实际上等同一个消息处理服务器。

Presence的复杂性体现在:

1.由于每个用户都有1到多个好友,服务器的处理量被放大。

2.分布式处理的复杂度,你的好友可能同时分布在n个服务器上,而且同时上线的好友没有规律。

3.请求量不均衡,可能瞬时非常大。

比如你服务器刚重启所有的客户几乎同时自动重连过来。

比如Twitter宕机都是在一些热点事件时,大家活跃度突然同时增大。

所以系统必须按峰值的处理量设计。

4.缓存cache设计困难。

每个用户的在线好友都不同,而且随时在变。

5.隐身同黑名单的业务逻辑很难高效处理。

OpenfireServer处理presence的流程如下,以3.6.0为准。

1.ConnectionHandler.messageReceived();

mina层面处理。

2.StanzaHander.process()=>

processPresence

xmpp层面。

处理所有xmpp包的方法,实际上只有login相关包在这里处理。

其他类型的包交由相关逻辑类来处理。

由于是个presence包,交由下面presence逻辑处理模块进行。

(alsoaddfromtopacket)

3.PacketRouteImpl.route()//routepresence

4.PresenceRoute.route()=>

handle()//routepresence

由于presence是一个需要路由的包,路由主要区分目标是本机还是远程,是component/server还是普通用户。

5.PresenceUpdateHandler.process()=>

broadcastUpdate

//process()updatedbandupdatecache,

callsPresenceManager.userAvaliable();

session.setPresence()...

6.Roster.boradcastPresence();

检查privacylist(隐身及黑名单用户)然后路由给所有在线好友。

7.RoutingTable.routePacket,routeTable.getRoutes()

真正的工作在这里,较慢。

8.session.process(),session.deliver

已经分发到相关用户了,调用该用户的session投递给此用户

9.nioconnection().deliver,delivertotheendusers

再回到MINA

因此Presence投递工作的核心是在6~7,不过其他的步骤也有不少细节的处理。

Openfire中6~7的实现比较精简和优雅,但如果想作为一个大型的高效消息投递系统还是有改进的空间。

注:

PresenceEventListener负责监听客户端发送的presence数据,包含登陆、离线、状态改变、邀请、订阅等状态。

2.9.2消息监听服务

SSL等监听服务的调度在ConnectionManagerImpl类中实现。

ConnectionManagerImpl.createClientSSLListeners()方法启动SSL监听。

2.9.3消息封装

信息处理采用XML节的方式传递信息,消息封装通常采用IQ、Message、Presence。

2.9.4Openfire消息包接受处理流程

2.10数据库处理

2.10.1Openfire连接数据库修改

如果是源码,打开openfire.xml文件,位于..\openfire\target\openfire\conf\

如果是安装文件,改文件位于:

..\openfire\conf\

Openfire的数据库处理采用直接调用JDBC的方式。

核心类为org.jivesoftware.database.DbConnectionManager。

数据库的处理与业务处理耦合,没有划分出专门的业务逻辑层。

2.10.2ConnectionProvider

此类为数据库提供者接口,如需连接mysql、hsqldb等数据库,需首先实现些接口,

2.10.3处理方式

通常直接调用XXManager中的实例方法,XXManager中又调用的是对应的接口XXProvider的方法,实际操作在该接口的实现类中实现。

实现类是动态绑定的(默认的实现类通常命名规则为DefaultXXProvider),在运行时根据ofproperty表中对应配置项值选择。

下面以添加用户组为例进行说明。

首先获得GroupManager的一个实例,在调用其构造函数时调用initProvider()方法,在该方法中获取数据库中配置项的值,若不为空则根据该值通过反射机制获取GroupProvider接口的实现类实例对象;

若为空则以DefaultGroupProvider作为GroupProvider接口的实现类并创建实例对象,然后调用GroupProvider.createGroup(Stringname)方法完成业务操作。

2.10.4常用类

org.jivesoftware.database.DbConnectionManager

连接管理类

org.jivesoftware.util.JiveGlobals

通常用于操作ofproperty表中记录

3Openfire插件开发流程

3.1OpenfirePlugins加载流程

3.2开发说明

所有插件都存放在openfire根下的plugins目录下

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 英语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1