openfire client聊天消息交互和存储离线(在线)消息记录策略
生活随笔
收集整理的這篇文章主要介紹了
openfire client聊天消息交互和存储离线(在线)消息记录策略
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
【0】如何將離線消息存檔,且在接收者上線之后,推送消息到接收者 發(fā)送方發(fā)送消息 -> 檢測接收方是否在線 ->
-> y -> 發(fā)送在線消息 -> 發(fā)送成功后,存檔到消息記錄;
-> n -> 修改數(shù)據(jù)包(XML流) 發(fā)送離線消息 -> 存檔到消息記錄 -> 不斷檢測某離線消息的接收方是否在線
-> y -> 推送離線消息記錄(未讀)到 剛剛登陸的離線用戶;
-> n -> 繼續(xù)檢測;
【1】消息交互 1)intro: ?以下消息內(nèi)容 是小生我從 smack client 發(fā)送 消息(hello,?abcdefg) 和另外一個 client 與 的 消息交互情況;? 2)接收方離線和發(fā)送方在線,而后接收方在線的情況 Attention)incoming(true->sender,false->receiver), processed(true->after processed, false->before processed) step1)發(fā)送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)發(fā)送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)以上就是當(dāng)發(fā)送者在線,而接收者離線的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 對離線消息的處理:?當(dāng)接收者不在線的時候,openfire 會把 msg 存儲到 ofoffline 這個數(shù)據(jù)庫表中;當(dāng) 接收者登錄在線后,openfire 會把該消息push 給 接收者,因而接收者在線后接受 openfire 推送的離線消息 后,會發(fā)送 響應(yīng)消息(參見session 的 from 元素值);之后openfire 會將該消息從 ofoffline 表中清空(即時刪除已經(jīng)發(fā)送到用戶的離線消息);
3)接收方和發(fā)送方都在線的情況 step1)發(fā)送方發(fā)送消息(處理前) <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)發(fā)送方發(fā)送消息(處理后) <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
【1】消息交互 1)intro: ?以下消息內(nèi)容 是小生我從 smack client 發(fā)送 消息(hello,?abcdefg) 和另外一個 client 與 的 消息交互情況;? 2)接收方離線和發(fā)送方在線,而后接收方在線的情況 Attention)incoming(true->sender,false->receiver), processed(true->after processed, false->before processed) step1)發(fā)送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)發(fā)送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)以上就是當(dāng)發(fā)送者在線,而接收者離線的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 對離線消息的處理:?當(dāng)接收者不在線的時候,openfire 會把 msg 存儲到 ofoffline 這個數(shù)據(jù)庫表中;當(dāng) 接收者登錄在線后,openfire 會把該消息push 給 接收者,因而接收者在線后接受 openfire 推送的離線消息 后,會發(fā)送 響應(yīng)消息(參見session 的 from 元素值);之后openfire 會將該消息從 ofoffline 表中清空(即時刪除已經(jīng)發(fā)送到用戶的離線消息);
3)接收方和發(fā)送方都在線的情況 step1)發(fā)送方發(fā)送消息(處理前) <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)發(fā)送方發(fā)送消息(處理后) <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)我們發(fā)現(xiàn),不管是發(fā)送在線消息 還是 離線消息,在openfire 處理前后,都可以對消息進行攔截; C2)根據(jù)以上打印info,我們計劃在?incoming?=?true,?processed?=?true 的case下 存儲消息記錄; C3)?如果接收方成功接收消息后(incoming?=?false,?processed?=?true),我們存儲在線消息,有且僅在該case下存儲消息到 ofchatlog 數(shù)據(jù)庫表;如果沒有接收方的響應(yīng)信息(incoming 始終等于true,即session.jsi 始終是 發(fā)送者,沒有接收者,表明接收者離線),openfire會存儲離線消息;?當(dāng)離線的接收者登錄后,openfire 推送離線消息給 該接收者(參見“2->step3,step4”的交互消息步驟),我們就在?incoming?=?false,?processed?=?true的case下 將該消息轉(zhuǎn)儲到到 ofchatlog; C4)一句話說完,我們的ChatLog 插件 涉及的 ofchatlog 數(shù)據(jù)庫表 只存儲 在線消息,而離線消息存儲在 ofoffline(owned by openfire);所以當(dāng)接收者離線的時候,離線消息不會存儲到 ofchatlog,而是會存儲到 ofoffline,離線用戶登錄后,會將 消息從 ofoffline 轉(zhuǎn)儲到 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下,存儲在線消息(或轉(zhuǎn)儲離線消息->chatlog 數(shù)據(jù)庫表)logsManager.insert(buildChatlog(packet, incoming, session));} else {return ;}
總結(jié)
以上是生活随笔為你收集整理的openfire client聊天消息交互和存储离线(在线)消息记录策略的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springmvc(18)使用WebSo
- 下一篇: js解析json数组+java对象转js