2016-04-02 33 views
1

我已經使用ejabberd開源服務器來實現我的聊天應用程序。它已成功地發送和接收郵件,但有時郵件確認和閱讀確認正在丟失。ejabberd如何將離線聊天保存到假脫機表

如果連接關閉會話節由客戶端發送到ejabberd服務器,那麼進一步的消息肯定存儲在假脫機表中。考慮客戶端網絡存在問題的情況,並且客戶端在沒有向服務器發送關閉會話節的情況下斷開連接。服務器假定客戶端仍處於聯機狀態,並且不將消息存儲到假脫機表中

但是,當客戶端聯機時,所有待處理的消息都會傳送到客戶端(假脫機加上服務器認爲客戶端聯機時的一些消息)。

ejabberd在哪裏存儲離線消息而不是假脫機表?

回答

3

如果您沒有正確關閉會話,那麼根據您的服務器內核的TCP/IP配置,服務器可能會採取意願來檢測連接已丟失。在這種情況下,ejabberd不會被通知TCP連接無效並在該TCP連接上發送消息。服務器將它們緩存在TCP堆棧中。從ejabberd的角度來看,這些消息已發送,因此它們不需要存儲在離線存儲中。當給定用戶沒有會話打開時,ejabberd將郵件存儲在離線存儲中,但在這種情況下,會有一個打開的會話。

要爲使用ejabberd社區版本的郵件添加更高級別的可靠性,您需要實施確認和可能的ping。您可以考慮實施XEP-0198: Stream Management並可能從服務器啓用XMPP Ping以檢測連接丟失。

+0

考慮流意外關閉並且從未恢復(超時發生)的情況。在某個時候發生新的連接之後,緩衝服務器中存儲的數據會發生什麼情況。它是否也被轉移到客戶端,還是我必須實施一些ejabberd模塊來克服這一點。 –

+0

如果流管理/ ping用於消息可靠性,那麼當會話結束時,消息將放置在離線存儲中。 –

+0

什麼應該是流管理恢復的理想超時值?目前我們已經保持了120秒,但有些節在客戶端迷路了。在ejabberd日誌中,它顯示9節(僅舉例)未被客戶確認。 我應該增加到24 * 60 * 60嗎? –