spark+openfire二次开发
二次开发手册
二次开发手册随着科技的不断发展,软件已经成为人们日常生活和工作中不可或缺的一部分。
为了满足用户对软件功能的需求,开发者经常需要进行二次开发。
本手册旨在为二次开发者提供一套完整、实用的指南,帮助其更好地进行软件二次开发工作。
1.二次开发的基本概念二次开发是指在已有软件的基础上,根据用户需求进行功能扩展、改进或定制的过程。
通过二次开发,可以充分利用已有软件的优点,提高软件的功能性和易用性。
2.二次开发的流程二次开发的流程包括需求分析、设计、编码、测试和部署等阶段。
其中,需求分析阶段是关键,需要充分了解用户需求,确定二次开发的具体内容和目标。
设计阶段需要对系统架构、数据库结构、界面设计等进行详细规划。
编码阶段需要按照设计要求进行编码实现。
测试阶段需要对二次开发的功能进行全面测试,确保其符合预期要求。
部署阶段需要对二次开发的软件进行部署和上线。
3.二次开发的技术实现在进行二次开发时,需要了解和掌握相关的技术实现。
例如,对于Web应用程序的二次开发,需要了解HTML、CSS、JavaScript等前端技术,以及后端语言如Python、Java等。
对于移动应用程序的二次开发,需要了解iOS或Android平台的开发技术。
此外,还需要了解数据库技术、版本控制技术等。
4.二次开发的常见问题及解决方案在进行二次开发时,可能会遇到一些常见问题,如兼容性问题、性能问题、安全性问题等。
针对这些问题,需要采取相应的解决方案。
例如,对于兼容性问题,需要进行充分的测试和调优;对于性能问题,需要进行性能分析和优化;对于安全性问题,需要加强安全措施和防范措施。
5.案例分析为了更好地说明二次开发的实践过程,本手册提供了几个案例分析。
这些案例涵盖了不同领域和不同规模的二次开发项目,通过分析这些案例的成功经验和问题所在,可以为读者提供宝贵的启示和帮助。
通过这些案例的分析和学习,读者可以更好地理解二次开发的实践操作和关键要点,为自己的二次开发工作提供指导和实践经验借鉴。
二次开发方案
二次开发方案引言:随着技术的进步和需求的不断增长,许多企业和组织在使用现有软件或系统时,常常会遇到一些功能不足或无法满足实际需求的情况。
这时,进行二次开发成为了一种常见的解决方案。
本文将探讨二次开发的定义、目的、方法以及实施过程,并提出一套完整的二次开发方案。
一、二次开发的定义二次开发指的是在已有软件或系统的基础上,根据用户的实际需求进行功能扩展、定制开发或性能优化等工作。
通过二次开发,用户可以在不改变现有软件或系统的基本框架和核心功能的前提下,实现更加个性化和高效的使用体验。
二、二次开发的目的二次开发的目的主要包括以下几个方面:1. 实现个性化需求:根据用户的具体需求,通过二次开发来实现一些特定的功能或业务流程,以满足用户个性化的需求。
2. 提升系统性能:通过优化代码结构、算法调优等手段,提高系统的性能和响应速度,确保系统能够高效稳定地运行。
3. 增强系统功能:在现有软件或系统的基础上,增加一些新的功能模块或扩展功能,以丰富系统的功能和可用性。
4. 适应业务发展:随着企业或组织的业务规模的扩大或业务流程的改变,二次开发可以根据业务需求进行系统定制或功能拓展,以适应新的业务发展。
三、二次开发的方法二次开发的方法多种多样,常见的方法有以下几种:1. 插件开发:在现有软件或系统的基础上,通过编写插件或模块,实现一些特定的功能或业务流程。
插件开发可以使系统具有一定的可扩展性,同时也能够保证原有系统的稳定性。
2. 数据库扩展:通过对现有数据库进行扩展或优化,实现更加高效的数据存储和管理,提升系统的运行效率。
3. API集成:利用现有软件或系统提供的API接口,将其他系统或软件与之集成,实现数据交互和功能扩展。
API集成可以使不同系统之间实现数据共享和协同工作,提高工作效率。
4. 定制开发:根据用户的具体需求,从头开始自定义开发一个全新的软件或系统。
定制开发可以满足用户的个性化需求,但同时也需要更多的开发时间和成本投入。
Openfire二次开发问题分析及解决
3 命名空间需要 自己新建 。 ) 如 Sac erh插件 Sac Pu i.v erh lbnj a文件第 2 8行 a 6 i(a epc. u lN fn sae q as AME P E J B R I_ E C ){ m e ( S AC _AB E _Q S AR H) rpy akt ade erh eu si) e l c e=hn lSac R q etq; P (
< es n vrl > o < ae dt > < n evr es n miSreV ri > o
建立其他的 j a a 文件来辅助其完成相应功 能。 v 在编写该 j a a 文件时需要注意 的几个地方 : v 1 实现 po s ak t 口时 , ) r es ce 接 c P 需要组装 一个 pc e并 通过 cm o akt op— n n aae. n P ce 发送出去 , e t n gre d akt M s 该组装通过 hn l Q e us来完成 , ad lR qe e t 而 hn lQ eus中我们只需完 成对插件 自身命名空 间的编写 , ad lR qe e t 其余 的 X P标准协议 的部分 不需考虑。 MP 2该 i a ) a 文件 如果实现 交互式 的功能 , v 则面 向客户 的显 示界面 由 pu is ml lgn. 中定 义的 ulj x r( p文件 ) s 完成 , 功能 部分 由该 jv 文 件完成 , aa 如果实现 的不是交互式 的功 能 , 可以直接在该 iv aa文件 中完成 , 无需显
) 中 的 N ME P C _ A B R _ E R A S A E J B E jO _ A CH。 S
最 后 ,将 相关 的文件制作 成 O e ie 件需要 的 j 文 件 ,通 过 pnr插 l a r O efe p ni 提供 的插 件上传 到服务器 , r 或者直接拷贝该 i 文件到 O efe a r pni r 安 装 目录 的 pu is 件 夹 下 。 lgn 文 22插件开发实 现 . 这 里以我们 自己开发 的“ 组织机构 管理 ” 插件 为例 , 简要 介绍插件 开 发 的 实 现 。 开 发 环 境 为 O e fe 4 J K1 . p ni 3 r +D . 0 6 +My cis510 下 E l e ..( p 同) 首先 , 。 准备我们需要 的文件 , 经分析 , 我们的插 件要进 行人机交互 , 需要提供 中文 的交互界 面, 并且需要对数据库进行某些修 改或 添加 。 根 据上文对插件开发的分析 , 我们需要提供上文提 到的全部文件 。
神东即时通的研发与应用
神东即时通的研发与应用文章介绍了神东煤炭集团随需而建的即时通信软件已越来越跟不上企业突飞猛进的发展步伐,各即时通信软件独立部署,数据孤立,且不能实现跨单位或部门之间的即时通信功能。
因此开发一个与神东现有信息系统集成的企业即时通信软件是很有必要的,不仅实现对神东组织架构的共享,而且打造了一款适用于神东煤炭集团的企业即时通信软件。
标签:企业即时通信;系统集成;XMPP;自主研发引言IM,Instant Messaging,即时通信软件,就是人们日常使用的QQ、MSN Messenger和Gtalk等等。
当前IM几乎作为每个上网者必然使用的工具,在国外的大型企业中有一些企业级的IM应用。
那么企业都可以利用它来开发适合企业自身工作、提高生产效率的企业即时通信平台。
神东即时通信平台(Shen Dong Instant Messaging)是一款为神东量身定做的企业即时通信平台。
神东公司即时通信的现状:(1)使用的软件种类不同。
目前神东公司内部使用的即时通信软件主要有:腾讯通RTX、恒创企业信使Active Messenger等。
(2)服务器单独部署。
公司各单位的即时通信软件大都以单位的形式进行部署,没有实现跨单位之间的互联互通,不能满足全公司范围内的即时通信需求。
(3)没有实现与神东业务协同平台的集成。
各单位目前所使用的即时通信软件大都是成品软件,软件开发商拥有技术资料,不能与神东自主研发的业务协同平台等系统进行融合,也就难以实现通过与神东现有系统的集成从而提高办公效率的目标。
(4)用户扩展费用昂贵。
目前神东购买的RTX仅能支持1000人的合法用户,只能给公司的少数人(如科级干部)分配账号,难以满足公司全员使用即时通信办公的需求。
若在全公司范围内统一采购成熟的即时通信软件,费用比较昂贵。
1 实现目标神东即时通信平台(Shendong Instant Messaging)是一款为神东煤炭集团量身定做的企业即时通信软件。
项目二次开发源代码及详细说明
项目二次开发源代码及详细说明I. 项目介绍本文档描述了一个二次开发项目的源代码及详细说明。
该项目是基于一个开源的企业资源管理系统进行二次开发,以满足特定客户的需求。
原始系统功能包括客户关系管理、订单管理、库存管理等,但客户需要在原始系统的基础上增加一些新的功能,比如业务报表的定制、权限管理的优化等。
为了满足客户的需求,我们需要对原系统进行二次开发,修改和添加一些功能,以适应客户的特定业务需求。
II. 项目目标1. 通过二次开发,实现客户需求的定制化功能,并满足特定的业务需求。
2. 优化原系统的权限管理模块,增强系统的安全性和稳定性。
3. 重构原系统的报表模块,实现业务报表的定制化功能。
4. 对原系统的库存管理模块进行优化,提高系统的性能和稳定性。
III. 项目源代码及详细说明1. 新增功能模块:客户需要系统新增一个产品价格管理模块,方便他们随时根据市场需求调整产品的价格。
我们在系统中增加了产品价格管理的功能模块,客户可以在这个模块中根据自己的需求,对产品的价格进行调整。
以下是新增功能模块的主要源代码及详细说明:```python# 产品价格管理模块import datetimefrom django.db import modelsclass Product(models.Model):name = models.CharField(max_length=100, verbose_name='产品名称')price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='产品价格') create_time = models.DateTimeField(default=datetime.now, verbose_name='创建时间')class Meta:verbose_name = '产品'verbose_name_plural = verbose_name# 增加产品价格调整记录模型class PriceAdjustRecord(models.Model):product = models.ForeignKey(Product, on_delete=models.CASCADE, verbose_name='产品')old_price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='调整前价格')new_price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='调整后价格')adjust_time = models.DateTimeField(default=datetime.now, verbose_name='调整时间')class Meta:verbose_name = '价格调整记录'verbose_name_plural = verbose_name```上面的代码是在原系统中新增的产品价格管理模块的源代码。
二次开发体系架构
二次开发体系架构二次开发体系架构是指在现有的软件或系统基础上进行功能扩展、定制化开发或集成的一种软件开发方式。
在进行二次开发时,通常需要根据业务需求进行功能拓展或定制化开发,以满足用户特定的业务需求。
为了实现二次开发的目标,需要设计一个合适的系统架构,以支持二次开发的各个环节。
1.模块化设计:为了方便二次开发的扩展和维护,系统应该采用模块化的设计思想。
将系统划分为多个独立的模块,每个模块负责一些特定的功能,模块之间可以相互独立地开发、测试和运行。
这种模块化的设计可以提高系统的可扩展性和可维护性。
2.接口设计:在进行二次开发时,通常需要与原有系统进行数据交互和功能集成。
为了方便二次开发人员对原有系统进行扩展和修改,系统应该提供良好的接口。
接口设计要符合标准化的规范,易于理解和使用,并且能够满足不同的二次开发需求。
3.数据管理:在进行二次开发时,往往需要对系统中的数据进行处理和管理。
为了方便二次开发人员对数据进行操作,系统应该提供统一的数据访问接口和数据管理工具。
这样就可以降低二次开发的难度,提高开发人员的效率。
4.扩展性和灵活性:二次开发体系架构应该具备良好的扩展性和灵活性,能够适应不同的二次开发需求。
系统应该提供灵活的插件机制,允许二次开发人员开发和集成不同的功能模块。
同时,也应该提供可配置的功能开关和参数,以便用户自定义系统的行为和功能。
在具体的二次开发过程中,可以按照以下步骤进行:1.需求分析:分析用户需求,明确二次开发的目标和要求。
了解原有系统的功能和架构,确定需要扩展的功能和模块。
2.体系架构设计:基于需求分析的结果,设计二次开发体系架构。
确定模块之间的关系和接口,确定数据管理和扩展机制。
3.模块开发:根据体系架构设计的结果,进行各个模块的开发。
每个模块应该具备独立测试和运行的能力,并与其他模块进行良好的协作。
4.集成和测试:将开发完成的模块进行集成,进行整体功能测试和性能测试。
保证二次开发的系统能够满足用户的需求和要求。
Spark+Openfire二次开发Message类型汇总
Spark+Openfire二次开发Message类型汇总在使用Spark+Openfire二次开发的时候,不免要涉及到Message包的处理。
在openfire封装的packet中,对于Message 的类型有如下这么几类:1. Chat2. Error3. GroupChat4. Headline5. Normal这里分别对每一种类型进行深入研究:1. Chat用途:标记发送单人聊天类型的消息。
举例XML:<message from="cds003@lvhb" to="lvhb@lvhb" type="chat"><body>测试消息!</body></message>Spark端显示:2. Error用途:标记错误类型的消息。
举例XML:<message from="我的聊天室@conference.lvhb" to="我的聊天室@conference.lvhb" type="error"><body>测试消息!</body><error code="406" type="modify"><not-acceptable xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error></message>说明:此种类型的消息在Spark端没有任何反应。
而且error消息为系统自动发送的,往往是由于错误发送消息,引起系统发送一个error类型的消息来提示spark之前发送的某一个消息是错的。
3. GroupChat用途:标记发送群体聊天类型的消息。
Openfire_spark_安装手册
Openfire+Spark安装手册王保政QQ:29803446Msn:baozhengw999@关键字:快速开发平台openjweb 增删改查即时通信2009-8-29目录第一章JA VA领域的IM解决方案 (3)第二章安装OPENFIRE3.6.4 (3)2.1配置机器的域名 (3)2.2安装OPENFIRE (3)2.2.1 安装 (3)2.2.2 运行数据库脚本 (4)2.2.3 数据库驱动jar包 (6)2.2.4 openfire初始化配置 (6)2.3设置用户 (12)第三章安装SPARK客户端 (13)第四章配置MSN网关 (15)4.1服务端配置MSN网关 (15)第五章RED5视频配置 (18)5.1部署RED5.WAR (18)5.2 SPARK客户端配置视频插件 (19)第六章使用SMACK开发即时通信功能 (22)第一章Java领域的IM解决方案Java领域的即时通信的解决方案可以考虑openfire+spark+smack。
当然也有其他的选择。
Openfire是基于Jabber协议(XMPP)实现的即时通信服务器端版本,目前建议使用3.6.4版本,这个版本是当前最新的版本,而且网上可以找到下载的源代码。
即时通信客户端可使用spark2.5.8,这个版本是目前最新的release版本,经过测试发现上一版本在视频支持,msn网关支持上可能有问题,所以选择openfire3.6.4+spark2.5.8是最合适的选择。
Smack是即时通信客户端编程库,目前我已测通通过jsp使用smack的API向openfire 注册用户发送消息,并且可以通过监听器获得此用户的应答消息。
通过smack向msn用户和QQ用户,gtalk用户发送消息应该也可以实现,关于向gtalk 用户发送消息的例子较多。
这个留待以后研究。
至少目前可以通过程序向spark发消息了。
对于局域网内部应用足以解决系统与用户交互的问题,甚至可以做自动应答机器人。
openfirespark二次开发服务插件
openfirespark二次开发服务插件==================== 废话begin============================最近老大让我为研发平台增加即时通讯功能。
告诉我用comet 在web端实现即时通讯。
最初狂搜集资料。
不能让自己方向错了。
这是很重要的。
不过还是难免的周折了一番。
测试了一个comet4j的聊天小例子。
用它前后端开发成本太大、对服务器也太大压力放弃了。
最终决定使用openfire +jsjac.js + JabberHTTPBind 然后实现老大要求的web 及时通讯功能。
很庆幸找到了hoojo大哥的demo 很不幸,他为了让大家复制代码,自己练习。
不提供jar包js下载。
(虽然好心但是足足浪费了我两天时间)一个jsjac.js库版本有问题。
很费劲的看源码。
哎。
然后、拿这个小demo 先交差。
顺便展示了spark 和web 聊天窗口,交互即时聊天。
顺便构想了一下,修改openfire用户表。
让用户来自系统。
组织则用自带的。
(当然这是预想。
其实openfire已经帮我们想过了。
)接着、全局搜索了openfire源码中包含ofuser表sql的类。
只有两个类。
很庆幸。
改了之后,改造用户密码加密认证方式。
当然这样做是错误的。
直到我发现类名字似乎有些不对的时候。
DefaultUserProvider 哈哈、嘲讽啊。
不出所料有一个实现类JDBCUuserProvider 。
直接配置就可以搞定、但是加密sha256加密过程和我平台不一样。
改造后就顺利搞定。
接着、到了插件开发过程。
这个过程很烦人。
网上很多帖子很多人去讲这个开发过程。
或许是两三年前的贴了。
很多过时了。
只能有一点帮助。
更多的是走向了错误的道路。
磕磕碰碰。
最终还是只能从源码中寻求出路。
这个过程整整浪费了我两星期时间。
很痛苦。
所以。
我会针对最新代码聊聊,spark 开发一个组织架构树插件。
展示出用户。
并可以与之聊天。
Openfire二次开发问题分析及解决
( )其 他 文 件 :ca gl .tl 本 信 息 、r d e tl 7 hn e g m 版 oh e m . m 说 a h
 ̄ 明 、lg lr e.il g s a1i图标 等 。 o o ag gf o o m lg .f
_
—
21 插 件 开 发 分 析 .
2 11新 插 件 要 在 Op n r\r ̄ lgn \ 声 明 该 插 件 .. e fe scpu i 中 l s 新 建 一 个 该 插 件 的 文 件 夹 ,一般 情 况 下 所 必须 的文 件 有 : ( )1 1 i 件 夹 :存放 所 需 类 库 。 b文 ( )s 2 r 件夹 :存 放 相 关 源 文 件 。 e文 ( )d t a e文 件 夹 : 位 于 sc文 件 夹 下 , 如 果 插 件 需 要 3 a bs a e
( )i8 件 夹 :存 放 国 际 化 文 件 , 即 相关 的 文 字 显 示 。 4 1n文
Pu i 个 接 口 ,iia zPu i 件 建 立 ,d soPu i 件 lg n两 nt le lg ii n插 et y lg r n插
销毁 。
数 据 库 的库 表 结 构 操 作 ,例 如 新 建 表 、新 建 字 段 等 .将 S L Q
文件 放于此文件 夹下 ,该 文件夹 下的 S L文件会 在插件 加载 Q
图片 库 、s l 样 式 表 等 相 关 文件 夹 以及 该 插 件 的 JP文件 。 te y S
( )pu is ml 件 :声 明 该 插 件 的文 件 。包 括 如 表 1所 6 lg . 文 nx 示 内容 。
表 1
<as> els
<a > n me
※ 类 文 件 名 。完 整 名 称 ,包 括 其 包 名
Openfire+Spark+Spark Web安装配置
Openfire+Spark+Spark Web安装配置一.安装环境操作系统:Windows XP Prefessional SP2服务器软件:Openfire 3.4.2Openfire Enterprise 3.4.2客户端软件:Spark 2.5.7Spark Fastpath Webchat 3.4.1JDK:J2SE 5.0 (1.5.0_03)二.安装Jabber服务器软件2.1 软件下载Jabber官网地址:/常用Jabber服务器软件:/software/servers.shtml本文以Openfire(Wildfire)为服务器,一款基于GPL协议开源软件,支持各种操作系统,软件需要java环境支持,不过软件本身自带了环境包,你可以根据你的需要下载不同的版本。
下载地址:/downloads/index.jsp#openfire Windows无java环境版本地址:/downloadServlet?filename=openfire/openfire_3_4_ 2.zip最新版本:Openfire 3.4.22.2Windows版本安装将openfire_3_2_2.zip解压缩到D:\。
特别要注意,openfire的全路径中不能有中文字符,最好主机名也是标准点的英文名称。
直接运行安装文件,D:\Openfire\bin\openfire.exe2.3openfire服务器配置浏览器地址栏中输入http://localhost:9090/即可开始即时通讯服务器配置。
(1)语言选择:中文简体(2)服务器设置:选择域及端口,建议默认(3)数据库设置:选“标准数据库”(4)标准数据库设置:将oracle驱动放在openfire的lib目录下。
在数据库驱动选项栏选择Oracle。
数据库URL填入你的数据库地址,端口和数据库名称,以及用户名和密码(需要在安装前创建),最大连接数,最小连接数和连接超时时间可自行调整。
openfire+sparkweb在线聊天
openfire+sparkweb在线聊天其中openfire为最为关键的点,但搭建相对来说还是比较简单的网站上有很对例子。
我就简要的说明下吧。
(我是在linux下搭建的openfire)openfire的搭建1.下载地址为:2.在linux端需要解压解压命令为:tar -xzvf openfire_3_8_2.tar.gz3.解压后就可以直接启动 (openfire/bin/openfire start)4.配置管理页面(搭建中,难点在于这里),管理页面为http://域名或ip:9090.如我在ip为192.168.8.2上搭建了openfire那么访问的管理配置页面就应该为:http://192.168.8.2:9090在初始设置中,其中有两个注意点说明下:(1).数据库设置,分为标准数据库连接和嵌入的数据库两种方式,其中"嵌入的数据库"为内置数据,无需过多的设置."标准数据库连接" 是指外置数据库,在数据库中注意应该创建一个名为openfire的database然后在该database中导入解压后的sql(目录为) openfire/resources/database/ openfire_mysql.sql .我建议使用标准数据库连接,方便二次开发和功能扩展(2).在"管理员账户"中的设置就是你以后登录管理配置页面的帐号和密码5.测试,需要在官网下spark() 如果你能创建用户就基本可以说明你openfire搭建成功了sparkweb相关吐槽一番,在网站上有很多资料都有说到red5.war这个字眼,但是当我下载这个war包的时候,总是不对,没错.少了一个文件.下载我自己打了一个war包供大家下载,不过需要大家提供点分数。
下载地址:/detail/shendixiong/6380643在上面的地址中下载了一个red5.war文件,然后将该文件放入到tomcat下的webapps下.启动tomcat 就会自动解压war .也就多了一个red5的目录!如果没有就证明失败了!如下图:然后就可以我访问为:就好了。
sparkopenfireconference修改使群组编程持久的。类似qq群(1)糊涂虫
sparkopenfireconference修改使群组编程持久的。
类似qq群(1)糊涂虫conference spark默认的是临时的,就是用户点击后才能加入到群组里面,关闭后从群组里退出。
要修改spark的这个功能,提供以下思路(原创)一、spark用户在登陆的时候,在openfire 进行SessionEventListener,通过插件的形式进行监听,在sessionCreated的时候进行,登陆用户的joinRoom ,从数据库取出他所在的groupname 然后进行joinroom。
作法; 在openfire写一个插件,插件主要代码如下:private JID serverAddress;privateJoinGroupsSessionEventListener listener =new JoinGroupsSessionEventListener();private XMPPServer server;private MultiUserChatServiceImplmucService;private classJoinGroupsSessionEventListenerimplements SessionEventListener {public void sessionCreated(Sessionsession) {System.out.println("a client connect!");JID userJid=session.getAddress();JoinGroups(userJid);}public void sessionDestroyed(Session session) {//ignoreJID userJid=session.getAddress();LeaveGroups(userJid);}public void resourceBound(Session session) {// Do nothing.}public void anonymousSessionCreated(Session session) {//ignore}public void anonymousSessionDestroyed(Session session) {//ignore}}@Overridepublic void initializePlugin(PluginManager manager, File pluginDirectory) {// TODO Auto-generated method stubserver=XMPPServer.getInstance();//mucService=server.getMultiUserCh atManager().getMultiUserChatService(ser) serverAddress = new JID(XMPPServer.getInstance().getServerIn fo().getXMPPDomain());SessionEventDispatcher.addListener(li stener);System.out.println("join groups plugin is running!");}public void LeaveGroups(JID userJid) { System.out.println(userJid.toBareJID() +" is leaving the room!");List<String>roomIds=MUCPersistenceManager.getRo omIDsByUserJid(userJid.toBareJID());for(String roomId:roomIds){System.out.println("roomid:"+roomId);org.jivesoftware.openfire.muc.spi.Roo mInforminf=MUCPersistenceManager.getRoomInfoByRoomId(roomId);String serviceID=rminf.getServiceID();mucService=(MultiUserChatServiceIm pl)server.getMultiUserChatManager().get MultiUserChatService(Long.parseLong(rm inf.getServiceID()));System.out.println("serviceid:"+serviceID);String roomName=rminf.getName();System.out.println("room name:"+roomName);LocalMUCRoomroom=(LocalMUCRoom)mucService.getC hatRoom(roomName);//从数据库中查询他的姓名作为昵称(得自己实现)String nickname = MUCPersistenceManager.getNickNameBy JId(userJid.toBareJID());if(nickname == null){if(userJid.getNode() != null){nickname = userJid.getNode();}else{nickname = userJid.getResource();}}// The user leaves the room 用户离开群try {if(!room.hasOccupant(nickname))return;LocalMUCRole role=(LocalMUCRole) room.getOccupant(nickname);room.leaveRoom(role);System.out.println("leaved!");} catch (UserNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}public void JoinGroups(JID userJid) {System.out.println(userJid.toBareJID() +" is joining the room!");try{List<String>roomIds=MUCPersistenceManager.getRoomIDsByUserJid(userJid.toBareJID());for(String roomId:roomIds){System.out.println("roomid:"+roomId);org.jivesoftware.openfire.muc.spi.Roo mInforminf=MUCPersistenceManager.getRoom InfoByRoomId(roomId);String serviceID=rminf.getServiceID();mucService=(MultiUserChatServiceIm pl)server.getMultiUserChatManager().get MultiUserChatService(Long.parseLong(rm inf.getServiceID()));System.out.println("serviceid:"+serviceID);String roomName=rminf.getName();System.out.println("room name:"+roomName);LocalMUCRoomroom=(LocalMUCRoom)mucService.getC hatRoom(roomName);//从数据库中查询他的姓名作为昵称(得自己实现)String nickname = MUCPersistenceManager.getNickNameBy JId(userJid.toBareJID());if(nickname == null){if(userJid.getNode() != null){nickname = userJid.getNode();}else{nickname = userJid.getResource();}}HistoryRequest historyRequest = null;String password = null;//构建成员进入群的PresencePresence presence = new Presence();presence.setTo(room.getJID().toBareJI D() + "/" + nickname);presence.setFrom(userJid);PacketExtension extension = new PacketExtension("x", "");presence.addExtension(extension);PacketRouterpr=server.getPacketRouter();LocalMUCUser user=new LocalMUCUser(mucService, pr, userJid);// The user joins the room 用户进入群try {LocalMUCRole role = room.joinRoom(nickname,password,historyRequest,user,presence);System.out.println("joined!");user.addRole(roomName, role);} catch (UnauthorizedException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (UserAlreadyExistsException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (RoomLockedException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ForbiddenException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (RegistrationRequiredException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ConflictException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ServiceUnavailableException e){// TODO Auto-generated catch blocke.printStackTrace();} catch (NotAcceptableException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}catch(Exception e){e.printStackTrace();}}@Overridepublic void destroyPlugin() {// TODO Auto-generated method stubSessionEventDispatcher.removeListen er(listener);listener = null;serverAddress = null;server=null;mucService=null;}在MUCPersistenceManager 这个类里添加如下方法,用于上面的使用// 石坚 20120609public static List<String> getRoomIDsByUserJid(String userJid) { Connection con = null;PreparedStatement pstmt = null;ResultSet rs = null;List<String> roomIDs=new ArrayList<String>();try {con = DbConnectionManager.getConnection();pstmt = con.prepareStatement(LOAD_ROOMIDS_B Y_JID);pstmt.setString(1, userJid);rs = pstmt.executeQuery();while(rs.next()) {String roomId = rs.getString("roomID");roomIDs.add(roomId);}}catch (SQLException sqle) {Log.error(sqle.getMessage(), sqle);}finally {DbConnectionManager.closeConnecti on(rs, pstmt, con);}return roomIDs;}public static String getRoomNameByRoomId(String roomId) { Connection con = null;PreparedStatement pstmt = null;ResultSet rs = null;String roomName=null;try {con = DbConnectionManager.getConnection();pstmt = con.prepareStatement(LOAD_ROOMNAM E_BY_ROOMID);pstmt.setString(1, roomId);rs = pstmt.executeQuery();if(rs.next()) {roomName= rs.getString("name");}}catch (SQLException sqle) {Log.error(sqle.getMessage(), sqle);}finally {DbConnectionManager.closeConnecti on(rs, pstmt, con);}}public static String getServiceIdByRoomId(String roomId) { Connection con = null;PreparedStatement pstmt = null;ResultSet rs = null;String serviceID=null;try {con = DbConnectionManager.getConnection();pstmt = con.prepareStatement(LOAD_SERVICEID_ BY_ROOMID);pstmt.setString(1, roomId);rs = pstmt.executeQuery();if(rs.next()) {serviceID= rs.getString("serviceID");}}catch (SQLException sqle) {Log.error(sqle.getMessage(), sqle);}finally {DbConnectionManager.closeConnecti on(rs, pstmt, con);}}public static String getNickNameByJId(String userJid) {Connection con = null;PreparedStatement pstmt = null;ResultSet rs = null;String nick=null;try {con = DbConnectionManager.getConnection();pstmt = con.prepareStatement(LOAD_NICKNAME_ BY_JID);pstmt.setString(1, userJid);rs = pstmt.executeQuery();if(rs.next()) {nick= rs.getString("nickname");}}catch (SQLException sqle) {Log.error(sqle.getMessage(), sqle);}finally {DbConnectionManager.closeConnecti on(rs, pstmt, con);}return nick;}public static RoomInfo getRoomInfoByRoomId(String roomId) { Connection con = null;PreparedStatement pstmt = null;ResultSet rs = null;RoomInfo rminf=null;try {con = DbConnectionManager.getConnection();pstmt = con.prepareStatement(LOAD_ROOMINFO _BY_ROOMID);pstmt.setString(1, roomId);rs = pstmt.executeQuery();if(rs.next()) {String serviceID= rs.getString("serviceID");String name= rs.getString("name");String naturalName= rs.getString("naturalName");Stringdescription=rs.getString("description");rminf=new RoomInfo(serviceID, name, naturalName, description);}}catch (SQLException sqle) {Log.error(sqle.getMessage(), sqle);}finally {DbConnectionManager.closeConnecti on(rs, pstmt, con);}return rminf;}public static List<String> getMembersByRoomId(String roomId) { // TODO Auto-generated method stubList<String> members=new ArrayList<String>();Connection con = null;PreparedStatement pstmt = null;ResultSet rs = null;try {con = DbConnectionManager.getConnection();pstmt = con.prepareStatement(LOAD_JIDS_BY_RO OMID);pstmt.setString(1, roomId);rs = pstmt.executeQuery();while(rs.next()) {String jid= rs.getString("jid");members.add(jid);}}catch (SQLException sqle) {Log.error(sqle.getMessage(), sqle);}finally {DbConnectionManager.closeConnection(rs, pstmt, con);}return members;}// end二、用户登陆了群,在进行打开chatroom的时候,spark默认的是显示的在线的用户,要进行修改。
二次开发开发流程
二次开发开发流程二次开发流程指的是在已有的软件或系统的基础上进行修改和扩展,以满足用户的特定需求。
下面将详细介绍二次开发的流程,并探讨其中的关键步骤和注意事项。
一、需求调研和分析在开始二次开发之前,首先需要进行需求调研和分析。
这一步通常包括与用户的沟通,明确用户的需求和期望,并分析现有软件或系统中的问题和不足之处。
通过需求调研和分析,可以为后续的开发工作提供指导和准备。
二、编写开发计划在需求调研和分析的基础上,编写开发计划是非常重要的一步。
开发计划应该明确开发的目标、范围、里程碑和交付日期等,以及需要的人力和物力资源。
同时,还要考虑风险管理和质量保证等方面的内容。
编写开发计划的目的是为了确保开发工作的顺利进行,并提高开发效率和质量。
三、系统设计和架构在有了清晰的开发计划之后,就可以进行系统设计和架构的工作了。
系统设计应该考虑到二次开发的目标和需求,并采用适当的设计模式和架构原则。
在系统设计中,可以涉及到数据模型的设计、业务逻辑的定义、页面布局和交互设计等方面。
通过系统设计和架构的工作,可以为后续的编码和测试工作提供指导和依据。
四、编码和测试编码和测试是二次开发流程中的关键步骤。
在编码阶段,开发人员需要根据系统设计和架构的要求,进行具体的编码工作。
编码应该遵循良好的编码规范和开发标准,并进行适当的模块化和复用。
在编码过程中,还需要进行代码的版本控制和文档的维护。
测试阶段是为了验证系统的正确性和稳定性。
测试工作可以分为单元测试、集成测试和系统测试等不同的层次。
在测试过程中,需要编写测试用例和测试脚本,并进行相应的测试工作。
测试结果应该被记录和分析,以便及时修复和改进。
五、部署和维护在完成编码和测试之后,就可以进行系统部署和维护的工作了。
部署工作包括将开发完成的代码和资源部署到实际的生产环境中,并进行必要的配置和调试。
维护工作包括对系统的运行状态进行监控和维护,以及进行必要的升级和补丁的更新。
在二次开发流程中,还有一些关键的注意事项需要特别关注:1.沟通与合作:在整个开发流程中,与用户和团队成员的有效沟通和合作是非常重要的。
Openfire+Spark
Openfire服务器的优点:
1、内部集成web服务器,可用于设计web管 理程序 2、插件机制,方便扩展 3、单台服务器就可大容量支持上万用户 4、安装和使用都非常简单
Spark客户端的介绍
Spark也是一个开源,跨平台IM客户端。 它的特性支持聊天,语音,视频,会议, 文件收发,截屏,连接msn等功能和强大安 全性能。 如果企业内部部署IM使用 Openfire+Spark是最佳的组合。 Spark 的核心则是Smack 。
数据库端
在数据库中建立一些用户的基本信息,如个人资料、邮箱等。
客户端程序
客户端程序基于Eclipse平台进行开发,界面的设计用 SWT来实现,借助于开源Smack的API运用Java语言实现 体的功能。 客户端主要功能是,提供友好的用户操作界面并显示系统 处理结果。客户端需要根据用户的要求,向服务器发送各种类 型的请求,然后等待服务器的响应。具体功能如下: 用户管理登录、注销、使用者本人的个人信息及好友的个 人信息管理等。 通信功能点对点文字通信、群组文字通信及密码管理、语 音呼叫、视频连接等。 文件管理文件传送、数字签名加密等。 其他动态广告等。
及时通讯系统
该系统是基于XMPP协议和Openfire的开发。 客户端与客户端之间的信息传递则必须要 经过服务端。 服务器则直接与数据库连接 机构如图:
系统功能及其实现
服务器端程序
服务器端采用Openfire进行业务处理。 运行的流程为:服务器运行后,开启服务,服务器开始侦听 用户请求。如有信息发送过来,首先,返回确认信息,然后,建立 一个线程,处理接收到的数据。在线程里,按照接收到数据的类 别,进行相应的处理,如有需要,向用户发送所处理的结果(成功 或失败的消息),处理后,线程就束了。采用这样的流程,可以 实时接受每个用户的请求,不会因为处理一个用户的请求,而 忽略了其他用户。
二次开发培训教程
二次开发培训教程一、引言二次开发是指在已有软件的基础上进行功能扩展或改进,以满足用户特定需求的一种开发模式。
在实际的软件开发过程中,二次开发可以大大提高软件的定制性和适用性,同时也能为软件的推广和应用提供更多的可能性。
因此,二次开发技能已经成为了软件开发领域中必不可少的一部分。
本教程将介绍二次开发的基本概念、工具、技术和实现方法,帮助读者快速入门并掌握二次开发的相关技能。
二、二次开发的基本概念1. 二次开发的定义二次开发是指在原有软件基础上进行功能扩展或改进的一种软件开发方式,常用于定制化开发或适应特定需求的软件开发过程中。
2. 二次开发的分类根据二次开发的目的和方式,可以将其分类为插件开发、定制化开发和接口开发等几种类型。
其中,插件开发通常是指通过开发插件或扩展,为原有软件增加新的功能或功能模块;定制化开发则是指根据用户特定需求对软件进行定制开发,满足用户个性化需求;而接口开发则是指通过开发接口或SDK,实现与其他系统的集成或对接。
三、二次开发的工具和技术1. 二次开发的常用工具常见的二次开发工具包括IDE(集成开发环境)、文本编辑器、调试工具、版本控制工具等。
在实际开发过程中,可以根据具体的开发需求和技术框架选择合适的开发工具。
2. 二次开发的常用技术常见的二次开发技术包括脚本语言、面向对象编程语言、Web开发技术等。
在实际开发过程中,可以根据具体的开发需求和软件架构选择合适的开发技术。
四、二次开发的实现方法与步骤1. 了解原有软件结构在进行二次开发之前,首先要了解原有软件的结构和功能,包括核心模块、接口和数据交互等,以便确定二次开发的具体目标和范围。
2. 确定二次开发需求根据用户的具体需求和软件的现状,确定二次开发的具体需求和目标,明确二次开发的功能模块和实现方式。
3. 选择合适的开发工具和技术根据二次开发的具体需求和软件的技术框架,选择合适的开发工具和技术,为二次开发提供技术支持和开发环境。
openfire二次开发
源码部署及编译1.将openfire源码解压2.将解压后的源码拷贝到Eclipse的工作空间中3.把源码openfire_src文件中build中有个eclipse文件夹,一个settings文件夹和classpath,project两个文件,将他们都复制到和build同级,并从其他项目中拷“.classpath"和".project",这两个文件,都是带点的!然后将eclipse文件夹中拷贝出来classpath,project 两个文件中内容分别替换掉对应.classpath,.project中的内容,就可以把classpath,project 两个文件删除掉了。
4.在Eclipse中导入openfire_src工程此时,会有这样的错误:这是由于缺少jar包引起的:将移除,在build的lib中,将没有build path的jar包Add To Build Path5.完成上部操作后,会有下面的错误:添加jar包,Add To Build Path 此时会有下面的错误实现借口中的方法即可将build—>lib下的jar包build path 6.编译7.运行选中项目,右键—>Run As—>Run Configuratios点击Search,输入ServerStarter选中Arguments选项卡,在VM arguments中填入-DopenfireHome="${workspace_loc:openfire_src}/target/openfire" ****千万注意DopenfireHome前面有个“-”选中Classpath选项卡,选中User Entries,点击右边的Advanced按钮选择Add Folder添加src/i18n 确定选择Add Folder添加resources/i18n 确定选择右侧的Advanced…–>选择Add Folderbuild/lib/dist 确定选择右侧的Advanced…–>选择Add Foldersrc/resources/jar 确定点击Apply,Run集群说明:如果使用源码做集群,则需要将src/plugins/clustering/src/java整个包删除,否则与hazelcast有冲突1.所有集群的域必须相同2.安装Hazelcast Clustering Plugin3.进入plugins—>hazelcast—>classes打开hazelcast-cache-config.xml文件,修改<network>下的代码为:<port auto-increment="true">5701</port><join><multicast enabled="false" /><tcp-ip enabled="true"><member>192.168.1.5</member><member>192.168.1.16</member><member>192.168.1.17</member></tcp-ip><aws enabled="false"/></join>或者:<join><multicast enabled="false" /><tcp-ip enabled="true"><member>192.168.1.5:5701</member><member>192.168.1.16:5701</member><member>192.168.1.17:5701</member></tcp-ip><aws enabled="false"/></join>4.重启服务器,点击Clustering查看集群中的节点重置openfire:将conf下的openfire.xml文件中的<setup>true</setup>删掉,重新进入http://localhost:9090进行配置即可Nginx负载均衡首先将pcre-8.34.tar.gz、zlib-1.2.8.tar.gz、nginx-1.7.3.tar.gz、nginx_tcp_proxy_module-master.zip 上传到linux系统中安装make:yum –y install gcc automake autoconf libtool make安装g++:yum install gcc gcc-c++安装pcre库将下载的pcre库解压,移动到usr/local/src目录中(这个目录可以随便指定)cd pcre-8.34./configuremakemake install安装zlib库将下载的zlib库解压,移动到usr/local/src目录中(这个目录可以随便指定)cd zlib-1.2.8./configuremakemake install安装openssl:yum –y install openssl openssl-develnginx默认只支持http负载均衡,为了让nginx支持tcp负载均衡,还需要https:///yaoweibin/nginx_tcp_proxy_module这个项目。
最好最实用的二次开发教程
最好最实⽤的⼆次开发教程 最好最实⽤的⼆次开发教程 ◆⼆次开发 什么是⼆次开发? ⼆次开发,简单的说就是在现有的软件上进⾏定制修改,功能的扩展,然后达到⾃⼰想要的功能和效果,⼀般来说都不会改变原有系统的内核。
为什么要⼆次开发? 随着信息化技术的不断发展,IT⾏业涌现出了⼀系列优秀的开源作品,其作者或是个⼈,或是项⽬⼩组,或是软件公司。
选择和应⽤这些优秀的开源软件,并在此基础上进⾏符合业务需求的⼆次开发,将给企业节省信息化成本(时间成本及开发成本)的同时,更能带来技术上的保障。
这就是我们常听的:站在巨⼈的肩膀上,你将看的更远。
所以国内很多公司需要⼆次开发的⼈才。
怎么做⼆次开发? 第⼀,你要有这个开源产品的所⽤语⾔的语⾔基础,能看懂代码是最基本的。
第⼆,你要对这个开源产品的功能和使⽤要有⽐较熟悉,因为你熟悉了,你才知道⼀个需求下来,你要改什么,什么是系统⾃带的,⼤概要怎么改。
第三,你要熟悉这个开源产品的数据结构,代码结构,系统的框架结构,核⼼是哪⾥,附属功能是在哪⾥。
简单点说,就是数据库,代码逻辑,⽂件⽬录的熟悉。
第四,根据你的需求,然后利⽤开源产品的内核,进⾏系统的扩展和修改,以达到你的需求介绍PHP的开源产品的⼆次开发的基本要求: 第⼀,基本要求:HTML(必须要⾮常熟悉),PHP(能看懂代码,能写⼀些⼩系统,如:留⾔板,⼩型CMS),Mysql(⾄少会⼀种数据库),Javascript(能看懂,能改现成的⼀些代码),Div+Css(能进⾏界⾯的调整,明⽩CSS是怎么使⽤的) 第⼆,熟悉开源产品的使⽤,⽐如 Dedecms,你要知道怎么登录,怎么新建栏⽬,怎么添加⽂章,模板标签的使⽤⽅法,模型的概念和使⽤⽅法等等⼀些功能 第三,要熟悉这个开源产品的数据库结构,还要理解⾥⾯核⼼⽂件的内容,⽐如:数据库类怎么使⽤,常 ⽤的安全过滤是怎么做的,模板引擎⼜是怎么使⽤的等等⼀些核⼼内容。
还要知道这个开源产品的⽬录结构,就 是说,你要知道哪是放模板的,哪⾥是做控制的,哪⾥是放样式的,等等 第四, 熟悉你的需求,对需求进⾏解读,然后确定如何对这个开源产品进⾏修改和扩展 经过⼆次开发后,你能获取到的是什么呢? 你能完成你的需求,你能积累经验,这⾥的经验有你⾃⼰的,也有别⼈的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
spark+openfire二次开发(一)
文章分类:Java编程
1.准备工作:
到官网上下载Openfire 3.6.4,并通过svn下载openfire、Spark和SparkWeb 的源代码
官网地址如下:
/downloads/index.jsp
注意官网上最新的Spark版本是2.5.8,其jdk环境最好使用1.6的版本。
2.环境搭建——spark源码安装配置
双击openfire_3_6_4.exe进行openfire的安装,安装过程很简单,不介绍了。
本例的开发环境是基于Eclipse的。
1)选择File——New——Project——Java Project。
输入项目工程名spark
Contents中选择"Create project from existiing source",然后把spark 文件所在的文件夹加进去.
点击Finish。
2)生成Spark:
点击Window::Show View::Ant
右击Ant面板,选择Add Buildfiles
展开spark::build文件夹,选择build.xml,点击"OK"
在Ant面板,展开Spark,双击"release",等一段时间,会提示"Build Successful"。
3)运行Spark:
点击Run::Open Debug Dialog...,出现"Run"窗口
选择"Java Application",右键点击"New"按钮.
在"Main"标签页,将New_configuration换成Spark.
点击Project::Browse按钮,选择Spark,再点OK.
点击Main class::Search按钮,选择main所在的类
uncher.Startup再点击OK
建议勾选Stop in main.
点击Classpath标签页,选择User Entries ,使得Advanced..按钮变的可用.点击Advanced按钮.在弹出来的Advanced Options窗口,选择Add Folders,再点OK,在Folder Selection窗口选择spark::src::resources 文件夹,点击OK
选择Common标签页,勾选Debug,Run前面的框
点击Apply,再点击Close
4)在run下选择spark,运行成功!
spark+openfire二次开发(二)
1.openfire源码部署
将下来的openfire_src_3_6_4.tar.gz解压后得到openfire_src文件夹,重命名为openfire。
其源码部署方式请参照spark+openfire二次开发(一)中spark源码的部署方式。
2.openfire运行配置
1)点击Run::Open Debug Dialog...,出现"Run"窗口
2)选择"Java Application",右键点击"New"按钮.
3)在"Main"标签页,将New_configuration换成openfire.
4)点击Project::Browse按钮,选择openfire,再点OK.
5)点击Main class::Search按钮,选择main所在的类ServerStarter
再点击OK,建议勾选Stop in main.
6)Arguments页面。
在VM arguments中加下内容
-DopenfireHome="${workspace_loc:Openfire}/target/openfire"。
7)点击Classpath标签页,选择User Entries ,使得Advanced..按钮变的可用.点击Advanced按钮.在弹出来的Advanced Options窗口,选择Add Folders,再点OK,在Folder Selection窗口选择Openfire/src/i18n文件夹,同样的方式选择Openfire/src/resources/jar文件夹,点击OK。
8)选择Common标签页,勾选Debug,Run前面的框
9)点击Apply,再点击Close
3.编译
1)将Openfire/src/i18n文件夹下的openfire_i18n_en.properties文件及Openfire/src/resources/jar文件夹下的admin-sidebar.xml文件拷贝到src\bin目录下,打开ANT面板,选择openfire【default】任务执行。
4.运行
运行openfire,控制台界面出现如下信息:
Openfire 3.6.4 [Mar 15, 2010 8:49:33 AM]
Admin console listening at http://127.0.0.1:9090
在浏览器中打开上面显示的地址,可进行openfire的管理配置。
spark+openfire二次开发(三)
文章分类:Java编程
spark的插件主要用来增强客户端的功能,下文主要介绍一下spark插件的开发过程。
1.最终完成效果如下:
增加一个My Plugin菜单,点击后显示hello面板。
2.开发流程
1)插件结构
插件的jar包结构如下示:
Java代码
1.example.jar
2. |- plugin.xml 插件定义文件
3. |- libs/ 包含所有运行此插件所需的classes文件
定义你的plugin.xml文件。
spark会自动读取插件jar中的plugin.xml文件,进行插件加载工作。
示例文件如下:
Java代码
1.<!-- Define your plugins -->
2.<plugin>
3. <name>Examples Plugin</name>
4. <version>1.0</version>
5. <author>Derek DeMoro</author>
6. <homePage></homePage>
7. <email>derek@</email>
8. <description>Shows some simple ways to create plugins.</des
cription>
9. <!--插件的接口实现类-->
10. <class>com.jivesoftware.spark.examples.ExamplePlugin</class
>
11. <minSparkVersion>2.5.0</minSparkVersion>
12.</plugin>
2)开发你的插件
插件源码目录结构
Java代码
1.example
2. |- src 源代码
3. |- lib 支持此插件的额外jar文件
4. |- resources 图片等资源文件
5. |- build 编译文件
6. |-build.xml ant打包插件的配置文件
插件的实现类,你的类首先要实现Spark 提供的Plugin 接口,然后实现它的一些方法。
Java代码
1.package org.jivesoftware.spark.examples;
2.
3.import org.jivesoftware.spark.plugin.Plugin;
4.
5./**
6. * 通过实现方法的不同,来显示不同的插件功能
7. */
8.public class ExamplePlugin implements Plugin {
9.
10. /**
11. * 插件安装后,初始化插件
12. */
13. public void initialize() {
14. System.out.println("Welcome To Spark");
15.
16. }
17.
18. /**
19. *spark关闭的时候调用,来实现信息持久化或释放资源
20. */
21. public void shutdown() {
22.
23. }
24.
25. /**
26. * 当用户请求关闭spark时,如果可以关闭返回真
27. */
28. public boolean canShutDown() {
29. return true;
30. }
31.
32. /**
33. * 插件卸载的时候调用,清除磁盘上的资源,如文件,图像等以及插
件安装时留下的所有组件
34. */
35. public void uninstall(){
36. // Remove all resources belonging to this plugin.
37. }
38.}
开发流程待续,例子先放上。