openfirespark二次开发服务插件.docx
《openfirespark二次开发服务插件.docx》由会员分享,可在线阅读,更多相关《openfirespark二次开发服务插件.docx(7页珍藏版)》请在冰豆网上搜索。
![openfirespark二次开发服务插件.docx](https://file1.bdocx.com/fileroot1/2022-10/29/6fb2de58-1d9d-45a8-b6fa-24f5257ac826/6fb2de58-1d9d-45a8-b6fa-24f5257ac8261.gif)
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,spark插件过程。
打包项目为exe文件。
等
=======================废话end=========================
openfire10,出来啦。
^_^支持自定义组,性能优化很多。
本文内容有:
1、openfire自定义用户表需要注意的地方
2、openfire服务器插件开发(开发环境搭建不说了。
下载项目,目前3.10,3.93都没有任何错)
3、openfire插件打包。
3、spark插件开发
4、openfire/spark打包exe
一、Openfire自定义用户表
userManager会在初始化的时候从数据库读取UserProvider/AuthProvider的实现类。
默认是defaultUserProvider
这些实现类参数被保存在ofproperty表中。
我们直接通过更新表完成对自定义用户表的配置。
insertintoofProperty(name,propValue)values
('jdbcProvider.driver','com.mysql.jdbc.Driver'),
('jdbcProvider.connectionString','jdbc:
mysql:
//主机地址/数据库?
user=root&password=root'),
--用户表数据库连接信息
('admin.authorizedJIDs','admin@127.0.0.1'),
--管理员账号信息,@amy-tang是安装openfire服务器时填写的IP,也可以写成服务器的域名。
('jdbcAuthProvider.passwordSQL','SELECTpasswordFROMsys_userWHEREaccount=?
'),
--校验用户名密码sql语句
('jdbcAuthProvider.passwordType','sha256'),--用户表加密方式
('jdbcUserProvider.loadUserSQL','SELECTfullname,emailFROMsys_userWHEREaccount=?
'),
--查询用户的sql语句
('jdbcUserProvider.userCountSQL','SELECTCOUNT(*)FROMsys_user'),
('jdbcUserProvider.allUsersSQL','SELECTaccountFROMsys_user'),
('jdbcUserProvider.usernameField','account'),
('jdbcUserProvider.nameField','fullname'),
('jdbcUserProvider.emailField','Email'),
--用户表关键字段的字段名称。
模糊查询用户拼装sql使用.account是账号唯一标示,fullname是用户名。
sys_user是用户表
UPDATEofPropertySETpropValue='org.jivesoftware.openfire.user.JDBCUserProvider'WHEREname='provider.user.className';
--设置用户数据库持久层实现类
UPDATEofPropertySETpropValue='org.jivesoftware.openfire.auth.JDBCAuthProvider'WHEREname='provider.auth.className'
--设置密码校验持久层实现类
注意事项:
1、加密key:
plain/md5/sha1/sha256/sha512加密过程详见org.jivesoftware.util.StringUtils.hash(password,"MD5");
2、admin.authorizedJIDs=admin@主机地址当Openfire修改了主机地址/域名的配置后admin无法登陆服务器。
需要修改数据库中配置的主机地址,
二、Openfire服务器插件开发
1、openfire中插件目录介绍,以及开发前准备。
Openfire源码环境搭建很简单。
目前3.10版,3.9版都没有任何问题直接能用,不用多余下载任何jar。
将源码解压至工作空间,新建相同项目名称即可。
如图:
暂时没用的插件可以buildpathremovefrompath先从工作空间移除。
剩下需要的开发插件如上图右
10的sourceoutputfolder有点问题,指向了一个插件里面。
修改即可。
项目右键—》buildpath—》configurebuildpath..—》Source—》outputfolder:
openfire_src/bin
9问题也不多,网上很多文章都很有用可以检索openfire二次开发去查阅相关搭建开发环境的文章。
开发前,建议先吧xmldebugger插件打开,或者留在src中。
会把所有交互xml打印输出非常有利于调试。
开发插件前,我们可以先看下,自带的那些插件的目录结构。
可以看出来开发插件都是依赖项目开发的,这样直接可以引用项目中的资源,bean。
不建议单独起一个project去开发插件
2、插件开发介绍
例如组织架构插件,我是将它作为一个服务组件进行开发,对外提供组织树的服务。
当客户端访问服务器jabber:
iq:
loadOrg的服务的时候,根据提供的参数返回组织架构,与用户信息、该插件需要实现两个接口Component,Plugin。
贴下代码
OrgTreePlugin代码,
请看打开代码自己查看。
该插件需要实现两个接口Component,Plugin,并实现相应方法。
插件的初始在PluginManager中419行。
可以断点查看插件初始化过程。
419StringclassName=pluginXML.selectSingleNode("/plugin/class").getText().trim();
420plugin=(Plugin)pluginLoader.loadClass(className).newInstance();
服务注册也很简单如:
OrgTreePlugin代码initializePlugin方法。
componentManager.addComponent(serviceName,this);
只是需要注意的是,该服务注册为服务组件的时候,会测试的访问该服务,测试是否正常。
如果出现异常就会自动调用componentManager.removeComponent(serviceName);,将改服务移除服务组件。
具体代码可以查看InternalComponentManager的addComponent()方法。
代码很简单。
DefaultOrgTreeProvider则为数据访问层。
不再贴了。
插件目录结构如下:
3、插件打包
最初在看openfire插件开发相关文章的时候、都提供了很多打包的方法,不过用着很不开心。
其实项目已经提供了所有各个功能的ant脚本build目录下build.xml文件。
三、spark插件开发
spark插件开发与openfire大略相似,
需要自身了解AWT相关的知识。
打包插件需要注意一点在build.xml中targetname="build.plugins"添加自己插件。
这样运行antbuild.plugins的时候就可以打包自己的jar了
build.plugins
<subanttarget="">
<filesetdir="./src/plugins/orgTree/"includes="*/build.xml"/>
</subant>
获取请求服务,处理数据关键代码
//请求消息定义
publicclassOrgTreeLoadextendsIQ
privateJSONArraygetOrgTreeJSON(StringorgId)throwsXMPPException{
//获取host
Connectioncon=SparkManager.getConnection();
host=con.getHost();
OrgTreeLoadsearch=newOrgTreeLoad();
search.setType(org.jivesoftware.smack.packet.IQ.Type.SET);
search.setTo("loadOrg."+host);//消息包处理
search.addExtension(OrgTreePacketExtension.getNewPacketExtension(orgId));
PacketCollectorcollector=con.createPacketCollector(newPacketIDFilter(search.getPacketID()));
con.sendPacket(search);
IQresponse=(IQ)collector.nextResult(SmackConfiguration.getPacketRepl