Openfire二次开发问题分析及解决
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据库版本
<adminconsole>
显示位置, 其中的 url 指向点 击 后 显 示 的 界 面 ; Name 指明显示名称; description 指明鼠标悬停显示。
(7) 其 他 文 件 : changelog.html 版 本 信 息 、 readme.html 说 明、 logo_large.gif\logo_small.gif 图标等。 2.1.2 在 pulgins.xml 文件中描 述 的<class>处 建 立 该 插 件 Java 文件
“您好, 诚意??请您加入会议。” 并 且 这 些 “??” 不 是 每 次 都 出 现 , 相 同 的 语 句 、 相 同 的 操 作 也 是 时 有 时 无 。 于 是 , 在 调 试 环 境 下 对 Openfire 源 代 码 流 程 进 行 了 跟 踪 , 发 现 问 题 出 现 在 XMLLightweightParser.java 文件中。 public void read(ByteBuffer byteBuffer) throws Exception {
invalidateBuffer(); if (buffer.length() > maxBufferSize) {
throw new Exception("Stopped parsing never ending stanza");
} CharBuffer charBuffer = encoder.decode (byteBuffer. buf()); char[] buf = charBuffer.array(); int readByte = charBuffer.remaining(); if (readByte == 0) {
2.2 插件开发
这里以自己开发的 “组织机构管理” 插件为例, 简要介绍 插件开发的实现 。 开发 环 境 为 Openfire3_6_4+JDK1.6.0+ MyEclipse5.1.0 (下同)。 首先, 准备需要的文 件 , 经 分 析 , 插 件 要 进行人机交互, 需要提供中文的交互界面, 并且需要对数据库 进行某些修改或添加。 根据上文对插件开发的分析, 需要提供 上文提到的全部文件。
if (namespace.equals (NAMESPACE_JABBER_IQ_SEARCH)) { replyPacket = handleSearchRequest(iq);
} 以上的 NAMESPACE_JABBER_IQ_SEARCH。 最后, 将相关的文件制作成 Openfire 插件需要的 jar 文件, 通 过 Openfire 提 供 的 插 件 上 传 到 服 务 器 , 或 者 直 接 拷 贝 该 jar 文件到 Openfire 安装目录的 plugins 文件夹下。
(5) Web 文 件 夹 : 存 放 该 插 件 的 显 示 界 面 。 包 括 images
图片库、 style 样式表等相关文件夹以及该插件的 JSP 文件。 (6) plugins.xml 文件: 声明 该 插 件 的 文 件 。 包 括 如 表 1 所
示内容。
表1
<calss> <name>
</tab> </adminconsole>
这样, 插件制作完成, 最后效果如图 1 所示。
图 1 组织机构管理插件
3 Openfire 源代码修改分析与解决
只要插件能胜任的工作, 建议都使用插件完成, 毕竟一旦 修改源代码, 带来的未知风险随之大大增加。 但是, 再某些特 定的情况下不得不进行源代码的修改时, 尽量进行小的改动达 到目的, 除非已经完全读懂全部的 Openfire 代码。 在修改完成 后要针对改后的服务器进行大量细致的测试, 保证所作改动不 会影响其他功能的正常运行。
数 据 库 的 库 表 结 构 操 作 , 例 如 新 建 表 、 新 建 字 段 等 , 将 SQL 文 件 放 于 此 文 件 夹 下 , 该 文 件 夹 下 的 SQL 文 件 会 在 插 件 加 载 时运行, 完成所需数据库的相关操作。
(4) i18n 文 件 夹 : 存 放 国 际 化 文 件 , 即 相 关 的 文 字 显 示 。 Openfire 的 相 关 显 示 文 字 都 在 i18n 中 后 缀 名 为 properties 的 文 件中定义, 在程序中直接引用相关定义, 完成语言转换时的显 示工作。
3.1 Openfire 源代码修改与分析
首先, 如果出现问题, 应定位该问题出现的代码段, 并确 定 该 代 码 段 所 属 的 jar 包 , 一 旦 进 行 修 改 , 只 需 打 包 该 jar 包 , 并替换到服务器中即可完成相关的修改。
举个例子来说明: 在 使 用 Openfire 服 务 器 进 行 即 时 消 息 系 统 搭 建 的 过 程 中 , 发 现 进 行 UTF-8 编 码 的 中 文 传 输 经 常 会 有 乱 码 出 现 , 并 且 出 现的非常有规律, 每次都是一个字变成了 “??”, 如
NETWORK & COMMUNICATION
网络与通信
O penfire 二次开发问题分析及解决
苑 为 陶卓彬
摘 要: 随着计算机技术的迅猛发展, 开源软件的二次开发利用逐渐成为进行快速开发的主要手 段。 针对利用开源软件 Openfire 二次开发搭建即时消息系统平台时遇到的问题, 分析并提出了相 应的解决方案, 并阐述了这些方案的实现。 关键词: Openfire; 即时消息系统; 二次开发
建立该 Java 文件, 在一般情况下需继承 3 个接口: (1) Plugin: 包 含 必 须 实 现 的 initializePlugin 和 destroyPlugin 两 个 接 口 , initializePlugin 插 件 建 立 , destroyPlugin 插 件 销毁。 (2) PropertyEventListener: 服 务 器 监 听 接 口 , 没 有 此 接 口 无法响应客户端的请求。 一般不需要与客户端有交互的插件没 有继承此接口。 (3) Component: 管理收发的接口。 该 Java 文件将完成插件的主要 工 作 。 Openfire 已 经 封 装 好 了 XMPP 协 议 , 因 此 交 互 上 只 需 考 虑 封 装 的 内 容 , 封 装 后 的 传 输 由 XMPP 协 议 完 成 , 除 非 想 放 弃 XMPP 协 议 而 改 用 其 他
2.1 插件开发分析
2.1.1 新插件要在 Openfire\src\plugins\ 中声明该插件 新建一个该插件的文件夹, 一般情况下所必须的文件有: (1) lib 文件夹: 存放所需类库。 (2) src 文件夹: 存放相关源文件。 (3) database 文 件 夹 : 位 于 sec 文 件 夹 下 , 如 果 插 件 需 要
※类文件名。 完整名称, 包括其包名 名称
<description> <author>
简要说明, 显示于插件页面 作者
<version> <date>
版本 日期
<minServerVersion> <databaseKey>
※最低服务器版本 数据库密码, 经常不使用
<databaseVersion>
首 先 建 立 了 一 个 Group 文 件 夹 , 在 其 中 建 立 了 lib、 src 文 件 夹 , src 文 件 夹 中 建 立 database、 i18n、 java、 web 文 件 夹 并 创 建 了 相 应 的 文 件 。 根 据 插 件 功 能 的 需 要 , 编 写 了 DefaultGroupTreeProvider、 GroupTreeManager、 GroupTreeNode、 GroupTreeProvider 这 4 个 Java 文 件 来 辅 助 Group3Plugin.java 完 成 相 应功能。 并在 Web 文件夹中建立了人 机 交 互 界 面 group3-form. jsp, 并在 plugin.xml 文件中对其显示位置进行描述:
String.valueOf(buf)); } byteBuffer.position(byteBuffer.position()-1); readByte--; if (readByte == 0) { return; }
} //... }
其 中 的 ByteBuffer 传 输 的 UTF-8 的 编 码 , 有 时 会 被 截 断 ,
如 果 截 断 点 是 一 个 汉 字 编 码 的 结 尾 , 那 么 不 会 出 现 “??”, 如
于 是 , 将 原 来 有 ByteBuffer 转 换 成 CharBuffer 的 过 程 改 写 , 做 了 一 个 循 环 , 如 果 存 在 ByteBuffer 不 完 整 ( 即 存 在 截 断 点 ) , 那 么 将 其 放 置 到 一 个 tmp 变 量 中 , 再 将 tmp 与 下 一 个 ByteBuffer 相 结 合 , 直 到 其 完 整 后 再 转 换 为 CharBuffer, 这 样 转 换 出来的汉字就不会存在 “??” 了。 这样做的好处是, 及解决了 乱 码 的 BUG, 又 不 改 变 原 来 程 序 的 运 行 方 式 , 非 中 文 或 者 完 整的 ByteBuffer 会 直 接 进 行 原 来 的 操 作 , 只 有 出 现 截 断 点 的 不 完整 ByteBuffer 才 会 进 行 编 写 的 代 码 , 拼 凑 成 完 整 的 , 这 大 大 降低了出现隐形问题的可能。
<adminconsole> <tab id="tab-users"> <sidebar id="sidebar-users"> <item id="group3-form" name="组织机构管理" url="
group3-form.jsp" description="Settings for Group3" /> </sidebar>பைடு நூலகம்
2 Openfire 插件开发问题分析与解决
作 为 一 款 较 为 成 熟 的 开 源 服 务 器 软 件 , Openfire 为 了 用 户 二次开 发 的 扩 展 , 提 供 了 良 好 的 插 件 支 持 模 式 。 对 于 Openfire 功能扩展, 一般情况下可直接使用开发插件的方式实现, 并且 在大多数情况下, 开发出来的插件是可以跨版本使用的, 这就 为向 Openfire 中添加功能提供了很好的支持。
1 引言
Openfire 是 一 款 开 源 的XMPP 服 务 器 软 件 , 经 常 作 为 搭 建 即时消息系统的服务器端使用, 其优良的性能以及良好的可 扩展性为多种模式的即时通信系统提供了强有力的支持。 可 二次开发的开源的模式也为用户制作具有自身特色的服务器 提供了良好的支持。
下文针对在使用 Openfire 服务器进行二次开发 中 遇 到 的 问 题, 结合自身特点和需要, 提出了相应的解决方案, 并重点 介 绍 了 Openfire 服 务 器 插 件 开 发 和 源 码 修 改 等 方 面 的 设 计 与 实现。
return;
54 2011. 03
NETWORK & COMMUNICATION
网络与通信
} char lastChar = buf[readByte-1]; if (lastChar >= 0xfff0) {
if (Log.isDebugEnabled()) { Log.debug ("Waiting to get complete char: " +
53
实用第一 智慧密集
协 议 。 当 然 , 也 可 以 建 立 其 他 的 Java 文 件 来 辅 助 其 完 成 相 应 功能。
在编写该 Java 文件时需要注意的几个地方: (1) 实 现 processPacket 接 口 时 , 需 要 组 装 一 个 packet 并 通 过 componentManager.sendPacket 发 送 出 去 , 该 组 装 通 过 handleIQRequest 来 完 成 , 而 handleIQRequest 中 只 需 完 成 对 插 件 自 身 命 名 空 间 的 编 写 , 其 余 的 XMPP 标 准 协 议 的 部 分 不 需 考虑。 (2) 该 Java 文 件 如 果 实 现 交 互 式 的 功 能 , 则 面 向 客 户 的 显示界面由 plugins.xml 中定义 的 url (jsp 文 件 ) 完 成 , 功 能 部 分 由 该 Java 文 件 完 成 , 如 果 实 现 的 不 是 交 互 式 的 功 能 , 可 以 直接在该 Java 文件中完成, 无需显示。 (3) 命名空间需要自己新建。 如 Search 插件 SearchPlubin.java 文件第 268 行