1. 正常離線:java
客戶端在離線以前發送<presence id='***' type ="unavailable"></presence>數據庫
由PresenceRouter 路由到PresenceUpdateHandler 中處理。api
判斷Type爲unavailable 以後先進行廣播,再設置session的狀態,再更新presenceManager中用戶最後一次的狀態。
服務器
presenceManager中會更新lastActivityCache 中的離線時間(這個時間就是咱們在OF控制檯中 用戶/組 頁面中看到的「最近一次退出」 的值來源了),若是這個presence 中含有status 子項,則會同時將此條presence 記錄到ofpresence 數據庫表中。
網絡
2.斷線:session
若是由於網絡緣由致使斷線,服務器端沒法收到客戶端口的presence消息,但MINA框架會激發sessionClosed事件,在OF的ConnectionHandler的sessionClosed() 方法中可進行後續處理。在這個方法中OF模似了客戶端口離線的presence。框架
3.OF之心跳檢測:spa
在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的資源。
這裏說一下openfire的整個鏈接過程,它提供的api都實現了心跳這些操做就不須要咱們本身去開發,還提供了斷鏈的各類事件給開發者。因此整個的過程是很簡單,openfire是基於MINA,java開發的,MINA是一個網絡應用程序框架,使用nio,至於nio就是new io,新的io,不阻塞的io,若是你們想了解能夠去搜索一下資料不少。