Openfire 用戶離線、斷線 及心跳檢測


客戶端登出分為正常離線和斷線,正常離線會發送presence 消息通知服務器,斷線則無通知發送。


1. 正常離線:

客戶端在離線之前發送<presence id='***' type ="unavailable"></presence>

由PresenceRouter 路由到PresenceUpdateHandler 中處理。

判斷Type為unavailable 之后先進行廣播,再設置session的狀態,再更新presenceManager中用戶最后一次的狀態。

presenceManager中會更新lastActivityCache 中的離線時間(這個時間就是我們在OF控制台中 用戶/組 頁面中看到的“最近一次退出” 的值來源了),如果這個presence 中含有status 子項,則會同時將此條presence 記錄到ofpresence 數據庫表中。


2.斷線:

   如果因為網絡原因導致斷線,服務器端無法收到客戶端口的presence消息,但MINA框架會激發sessionClosed事件,在OF的ConnectionHandler的sessionClosed() 方法中可進行后續處理。在這個方法中OF模似了客戶端口離線的presence。

  

3.OF之心跳檢測:

在OF服務器設置中有一項 Client Connections --> Idle Connections Policy

選擇Disconnect  client after they have been idle for [***] seconds

        Send a XMPP Ping request to idle clients

對這兩項的解釋如下:

        MINA框架本身提供了idle檢測功能,這項功能可檢測客戶端口建立了TCP/IP連接、卻不發送任何消息的情況。

當我們設置了第一項中的時長,OF會調用MINA的session.setIdleTime()方法,在客戶端口連接經過指定時長未發送任何消息的情況下觸發sessionIdle事件,由sessionIdle()方法處理。

        在ClientConnectionHandler 的sessionIdle()方法中判斷當前的idle次數大於1次時將關閉客戶端連接。  我們設置了idle Time 之后這個idle的檢測發生在達到一半時間和達到指定時間,每次檢測都會將idle 的次數加1 。 也就是說我們一旦設定了這個時長,則MINA框架會在這個時長的一半時間內,客戶端仍未發送消息時觸發一次sessionIdle事件,然后在到達指定時長,客戶端仍未發送消息時再觸發一次。

        Openfire 對這個ConnectionHandler 進行了再一次封裝,在第一次觸發sessionIdle時發送一次ping 消息,逼迫客戶端進行響應。-------------這里就是我們設置第二個選項的意義所在。

        使用心跳檢測我們可以關閉那些長時間不活動的連接,以節約OF的資源。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM