openfire的MUC改造类似QQ永久群(二)
在前面一篇博客中写到(见点击查看),怎么把openfire的MUC通过插件的形势转为可持久化的类似QQ群一样的功能。 但是很多人没看懂,今天再写一篇,并赋予源码,希望能解开你们的迷惑。本文基于问答形势
1.如何实现把成员持久化
答:其实代码中实现持久化的代码就如下几行代码,这几行代码是模拟管理后台加入成员到MUC群
MUCRoom mucroom =XMPPServer.getInstance().getMultiUserChatManager().getMultiUserChatService(roomJID).getChatRoom(roomJID.getNode());
IQ iq = new IQ(IQ.Type.set);
Element frag = iq.setChildElement("query", "http://jabber.org/protocol/muc#member");
Element item = frag.addElement("item");
item.addAttribute("affiliation", "member");
item.addAttribute("jid", mjid);
item.addAttribute("nick",nickname);
mucroom.getIQAdminHandler().handleIQ(iq, mucroom.getRole());
2.我写了一个MUCEventListener的监听实现为什么调试没有进入?
答:光写了监听实现是不够的,必须在Plugin主类里面的方法initializePlugin里面添加如下一行代码 MUCEventDispatcher.addListener(xxxx); ,这里的xxxx你可以是new 一个MUCEventListener实现或者 this(前提条件是你的plugin主类也实现了MUCEventListener)。
3.为什么注释里面有句如果muc房间里面一个用户都还不存在?
答:如果房间一个成员都还没有,那么这个时候是不是房间正在创建中呢?创建人默认不是成员,而是会自动 把创建人的信息放入到表ofmucaffiliation里面。
4.为什么不能通过协议的形式把昵称插入数据库,而是自己写了一个updateNick方法?
答:这个我也试过多次,后面跟源码进入,发现就是你设置了昵称也不能插入数据库里面,因为在插件的时候就没用到这个昵称。
5.成员数据持久化客户端还需要做什么?
答:加入这个插件后,客户端不需要做任何改动和添加代码
6.如果想成员登录后自动获取加入过的群列表怎么做?
答:写一个SessionEventListener的实现,然后监听用户登录后查询用户的群列表再自定义组装一个IQ或者Message返回客户端,客户端解析获取;如果想客户端主动来获取, 那么可以自定义一个IQhander来实现然后客户端发起IQ服务端响应;如果希望更加简单一点的实现,当然可以在插件里面提供对外的servlet访问接口,通过调用url的形势返回数据,几种方式任意选择。
7.为什么我登录了账号,在线了但是群里面看不见我?
答:请明白MUC本来是会议室的意思,也就说(你到公司了,但是你不进入会议室,会议室的人认为你来了吗?)所以你登录后必须join后,其他成员才可以在在线人员里面看见你。
暂时就写这些问题了啊,下面请自行下载源码和编译后的插件包:
http://pan.baidu.com/s/1o6JqTg2