openfire client聊天消息交互和存储离线(在线)消息记录策略

【0】如何将离线消息存档,且在接收者上线之后,推送消息到接收者
发送方发送消息 -> 检测接收方是否在线 ->
-> y -> 发送在线消息 -> 发送成功后,存档到消息记录;
-> n -> 修改数据包(XML流) 发送离线消息 ->  存档到消息记录 -> 不断检测某离线消息的接收方是否在线
-> y -> 推送离线消息记录(未读)到 刚刚登陆的离线用户;
-> n -> 继续检测;

【1】消息交互
1)intro:  以下消息内容
是小生我从 smack client 发送 消息(hello, abcdefg) 和另外一个 client 与 的 消息交互情况; 
2)接收方离线和发送方在线,而后接收方在线的情况
Attention)incoming(true->sender,false->receiver), processed(true->after processed, false->before processed)
step1)发送msg时,接收者离线;(openfire处理前)
<message to="tangtang@lenovo-pc" id="8akb9-36" type="chat" from="pacoson@lenovo-pc/Smack"><body>hello, abcdefg</body><thread>1d5f0c93-4eb6-4461-a09a-0da6fc9d3ac6</thread></message>
org.jivesoftware.openfire.session.LocalClientSession@1960f3cb status: 3 address: pacoson@lenovo-pc/Smack id: 8vqkiso6gv presence: 
<presence id="8akb9-34" from="pacoson@lenovo-pc/Smack"><c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://www.igniterealtime.org/projects/smack" ver="os2Kusj3WEOivn5n4iFr/ZEO8ls="/>
</presence>
incoming = true, processed = false
step2)发送msg时,接收者离线;(openfire处理后)
<message to="tangtang@lenovo-pc" id="8akb9-36" type="chat" from="pacoson@lenovo-pc/Smack"><body>hello, abcdefg</body><thread>1d5f0c93-4eb6-4461-a09a-0da6fc9d3ac6</thread></message>
org.jivesoftware.openfire.session.LocalClientSession@1960f3cb status: 3 address: pacoson@lenovo-pc/Smack id: 8vqkiso6gv presence: 
<presence id="8akb9-34" from="pacoson@lenovo-pc/Smack"><c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://www.igniterealtime.org/projects/smack" ver="os2Kusj3WEOivn5n4iFr/ZEO8ls="/>
</presence>
incoming = true, processed = true
Attention)
A1)以上就是当发送者在线,而接收者离线的openfire消息记录;
A2)以下是 接收者登录后的 openifre 消息记录;

step3)接收者登录在线(openfire处理前)
<message to="tangtang@lenovo-pc" id="8akb9-36" type="chat" from="pacoson@lenovo-pc/Smack"><body>hello, abcdefg</body><thread>1d5f0c93-4eb6-4461-a09a-0da6fc9d3ac6</thread><delay xmlns="urn:xmpp:delay" from="lenovo-pc" stamp="2016-07-18T00:39:29.759Z"/></message>
org.jivesoftware.openfire.session.LocalClientSession@46cc3cbd status: 3 address: tangtang@lenovo-pc/Smack id: 4qrph1nzci presence: 
<presence id="2h2Pk-7" from="tangtang@lenovo-pc/Smack"><c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://www.igniterealtime.org/projects/smack" ver="os2Kusj3WEOivn5n4iFr/ZEO8ls="/>
</presence>
incoming = false, processed = false
step4)接收者登录在线(openfire处理后)
<message to="tangtang@lenovo-pc" id="8akb9-36" type="chat" from="pacoson@lenovo-pc/Smack"><body>hello, abcdefg</body><thread>1d5f0c93-4eb6-4461-a09a-0da6fc9d3ac6</thread><delay xmlns="urn:xmpp:delay" from="lenovo-pc" stamp="2016-07-18T00:39:29.759Z"/></message>
org.jivesoftware.openfire.session.LocalClientSession@46cc3cbd status: 3 address: tangtang@lenovo-pc/Smack id: 4qrph1nzci presence: 
<presence id="2h2Pk-7" from="tangtang@lenovo-pc/Smack"><c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://www.igniterealtime.org/projects/smack" ver="os2Kusj3WEOivn5n4iFr/ZEO8ls="/>
</presence>
incoming = false, processed = true
Conclusion)openfire 对离线消息的处理: 当接收者不在线的时候,openfire 会把 msg 存储到 ofoffline 这个数据库表中;当 接收者登录在线后,openfire 会把该消息push 给 接收者,因而接收者在线后接受 openfire 推送的离线消息 后,会发送 响应消息(参见session 的 from 元素值);之后openfire 会将该消息从 ofoffline 表中清空(即时删除已经发送到用户的离线消息);


3)接收方和发送方都在线的情况
step1)发送方发送消息(处理前)
<message to="tangtang@lenovo-pc" id="8akb9-76" type="chat" from="pacoson@lenovo-pc/Smack"><body>i am a student.</body><thread>20b6bc6b-64b8-4cc8-a58c-c416090ae1bc</thread></message>
org.jivesoftware.openfire.session.LocalClientSession@647c5490 status: 3 address: pacoson@lenovo-pc/Smack id: 30glj4xlhu presence: 
<presence id="8akb9-72" from="pacoson@lenovo-pc/Smack"><c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://www.igniterealtime.org/projects/smack" ver="os2Kusj3WEOivn5n4iFr/ZEO8ls="/>
</presence>
incoming = true, processed = false
step2)接收方接收消息(处理前)
<message to="tangtang@lenovo-pc" id="8akb9-76" type="chat" from="pacoson@lenovo-pc/Smack"><body>i am a student.</body><thread>20b6bc6b-64b8-4cc8-a58c-c416090ae1bc</thread></message>
org.jivesoftware.openfire.session.LocalClientSession@32e2ab29 status: 3 address: tangtang@lenovo-pc/Smack id: 3t4gvqjm80 presence: 
<presence id="ZvrMI-7" from="tangtang@lenovo-pc/Smack"><c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://www.igniterealtime.org/projects/smack" ver="os2Kusj3WEOivn5n4iFr/ZEO8ls="/>
</presence>
incoming = false, processed = false
step3)接收方接收消息(处理后)
<message to="tangtang@lenovo-pc" id="8akb9-76" type="chat" from="pacoson@lenovo-pc/Smack"><body>i am a student.</body><thread>20b6bc6b-64b8-4cc8-a58c-c416090ae1bc</thread></message>
org.jivesoftware.openfire.session.LocalClientSession@32e2ab29 status: 3 address: tangtang@lenovo-pc/Smack id: 3t4gvqjm80 presence: 
<presence id="ZvrMI-7" from="tangtang@lenovo-pc/Smack"><c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://www.igniterealtime.org/projects/smack" ver="os2Kusj3WEOivn5n4iFr/ZEO8ls="/>
</presence>
incoming = false, processed = true
step4)发送方发送消息(处理后)
<message to="tangtang@lenovo-pc" id="8akb9-76" type="chat" from="pacoson@lenovo-pc/Smack"><body>i am a student.</body><thread>20b6bc6b-64b8-4cc8-a58c-c416090ae1bc</thread></message>
org.jivesoftware.openfire.session.LocalClientSession@647c5490 status: 3 address: pacoson@lenovo-pc/Smack id: 30glj4xlhu presence: 
<presence id="8akb9-72" from="pacoson@lenovo-pc/Smack"><c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://www.igniterealtime.org/projects/smack" ver="os2Kusj3WEOivn5n4iFr/ZEO8ls="/>
</presence>
incoming = true, processed = true

Conclusion) 
C1)我们发现,不管是发送在线消息 还是 离线消息,在openfire 处理前后,都可以对消息进行拦截;
C2)根据以上打印info,我们计划在 incoming = true, processed = true 的case下 存储消息记录;
C3) 如果接收方成功接收消息后(incoming = false, processed = true),我们存储在线消息,有且仅在该case下存储消息到 ofchatlog 数据库表;如果没有接收方的响应信息(incoming 始终等于true,即session.jsi 始终是 发送者,没有接收者,表明接收者离线),openfire会存储离线消息; 当离线的接收者登录后,openfire 推送离线消息给 该接收者(参见“2->step3,step4”的交互消息步骤),我们就在 incoming = false, processed = true的case下 将该消息转储到到 ofchatlog;
C4)一句话说完,我们的ChatLog 插件 涉及的 ofchatlog 数据库表 只存储 在线消息,而离线消息存储在 ofoffline(owned by openfire);所以当接收者离线的时候,离线消息不会存储到 ofchatlog,而是会存储到 ofoffline,离线用户登录后,会将 消息从 ofoffline 转储到 ofchatlog;
<pre name="code" class="java">public class ChatlogPlugin implements PacketInterceptor, Plugin {private static final Logger log = LoggerFactory.getLogger(ChatlogPlugin.class);private static PluginManager pluginManager;private static ChatlogManager logsManager;// Hook for intercpetornprivate InterceptorManager interceptorManager;private PresencePlugin presencePlugin;public ChatlogPlugin() {interceptorManager = InterceptorManager.getInstance();logsManager = ChatlogManager.getInstance();}/*** <b>function:</b> 拦截消息核心方法,Packet就是拦截消息对象*/@Overridepublic void interceptPacket(Packet packet, Session session,boolean incoming, boolean processed) throws PacketRejectedException {Packet copyPacket = packet.createCopy();if (packet instanceof Message) {Message message = (Message) copyPacket;System.out.println(message.toXML());System.out.println(session);System.out.println("incoming = " + incoming + ", processed = " + processed);if (message.getType() == Message.Type.chat) { // 一对一聊天,单人模式if (!incoming && processed) { // 有且仅在该case下,存储在线消息(或转储离线消息->chatlog 数据库表)logsManager.insert(buildChatlog(packet, incoming, session));} else {return ;}
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331011.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring boot 入门篇

http://www.cnblogs.com/ityouknow/p/5662753.html

通往大神之路,百度Java面试题前200页。

转载自 通往大神之路&#xff0c;百度Java面试题前200页。基本概念 操作系统中 heap 和 stack 的区别什么是基于注解的切面实现什么是 对象/关系 映射集成模块什么是 Java 的反射机制什么是 ACIDBS与CS的联系与区别Cookie 和 Session的区别fail-fast 与 fail-safe 机制有什么区…

springmvc(17)异步消息简介(部分)

【0】README1&#xff09;本文旨在 intro 异步消息的 相关基础知识&#xff1b;【1】intro【1.1】发送消息1&#xff09;intro&#xff1a;间接性是异步消息的关键所在&#xff1b;2&#xff09;当一个应用向另一个应用发送消息时&#xff0c;两个应用之间没有直接的联系。相反…

搭建一个简单的Spring boot+maven项目

http://www.cnblogs.com/suncj/p/4065589.html

去BAT面试完的Mysql面试题总结(55道)

转载自 去BAT面试完的Mysql面试题总结&#xff08;55道&#xff0c;带完整答案&#xff09;55道互联网大公司的经典面试题&#xff0c;全部答对月薪5W没问题。1、一张表里面有ID自增主键&#xff0c;当insert了17条记录之后&#xff0c;删除了第15,16,17条记录&#xff0c;再把…

js解析json数组+java对象转json字符串

function checkoutUserlist(){ // js 解析json数组var statuslist [{"isAvailabe":"1","name":"pacoson"},{"isAvailabe":"0","name":"tangtang"},{"isAvailabe":"0",&…

【双11劲爆干货】阿里高级Java面试题(首发,70道)

转载自 【双11劲爆干货】阿里高级Java面试题&#xff08;首发&#xff0c;70道&#xff0c;带详细答案&#xff09; 整理的70道阿里的Java面试题&#xff0c;都来挑战一下&#xff0c;看看自己有多厉害。下面题目都带超详细的解答&#xff0c;详情见底部。 1、java事件机制包括…

系统项目源码

http://blog.sina.com.cn/s/blog_4b5bc011010114zu.html

http长/短轮询和WebSocket 的介绍和比较

【1】http协议介绍1&#xff09;介绍&#xff1a;http协议是请求/响应范式的&#xff0c;每个http 响应都对应一个 http 请求&#xff0c;http协议是无状态的&#xff0c;多个http请求之间是没有关系的&#xff1b;2&#xff09;http协议的被动性&#xff1a;在标准的HTTP请求响…

分享一套阿里高级Java面试题,要去阿里的先过这些题。

转载自 分享一套阿里高级Java面试题&#xff0c;要去阿里的先过这些题。

从零开始学spring-boot(2)-集成spring-data-jpa

http://blog.csdn.net/u013257425/article/details/52970820

基于openfire源码开发插件

【0】README1&#xff09;本文旨在 简述如何 基于openfire源码开发插件&#xff0c; 如何导入 openfire源码到 eclipse&#xff0c;参见 http://blog.csdn.net/pacosonswjtu/article/details/518716222&#xff09;also , you can checkout source code of the plugin from h…

分享18道Java基础面试笔试题

转载自 分享18道Java基础面试笔试题&#xff08;面试实拍&#xff09; 1.你最常上的两个技术站和最常使用的两个app分別进什么&#xff1f;主要解决你什么需求&#xff1f; 2.请简述http协议中get请求和post请求的区别. 3.请简述session和cookie的区別. 4.简述Servlet与JSP的关…

xmpp协议框架包介绍:org.xmpp.packet.Packet+JID+PacketInterceptor+Session

【1】org.xmpp.packet.Packet&#xff08;数据包&#xff09;&#xff1a;1&#xff09;intro&#xff1a; 一个 XMPP数据包&#xff08;也被称为 数据节&#xff09;。每个数据包由 dom4j 元素来支持。有一系列易于操作元素&#xff08;Element&#xff09;的便捷方法&#xf…

Dubbo面试题锦集

转载自 Dubbo面试题锦集1、默认使用的是什么通信框架&#xff0c;还有别的选择吗?2、服务调用是阻塞的吗&#xff1f;3、一般使用什么注册中心&#xff1f;还有别的选择吗&#xff1f;4、默认使用什么序列化框架&#xff0c;你知道的还有哪些&#xff1f;5、服务提供者能实现失…

spring-boot--整合thymeleaf模板

http://blog.csdn.net/li396864285/article/details/53811527

Zookeeper面试题锦集

转载自 Zookeeper面试题锦集1、zookeeper是什么框架&#xff1f;2、有哪些应用场景&#xff1f;3、使用什么协议&#xff1f;4、说说分布式一致性算法Paxos5、说一说选举算法及流程6、zookeeper有哪几种节点类型&#xff1f;7、zookeeper对节点的watch监听通知是永久的吗&#…

ReviewForJob(1)数据结构与算法分析引论

【1】 数学基础1.1&#xff09;本书将使用以下4个定义&#xff1a; 对上述定义的分析&#xff08;Analysis&#xff09;&#xff1a; - A1&#xff09;第一个定义是说T&#xff08;N&#xff09;的增长率小于等于f&#xff08;N&#xff09;的增长率&#xff1b;- A2&#x…