2012-01-17 100 views
0

我有一個xmpp/ejabberdb應用程序,它使用外部服務提供事件功能,但當此服務不可用時,我想要斷開/註銷所有客戶端。這可能嗎?怎麼樣?從XMPP註銷客戶端

回答

2

我按照我需要的方式工作。事實上,我沒有找到任何簡單的方法讓我自己的服務器註銷所有連接的用戶在某種情況下,所以我挖掘了e​​jabberd的代碼,並找出了一種方法來自己做。

在ejabberd_c2s.erl模塊中,當客戶端註銷或由於某種原因導致其套接字被丟棄時,FSM將終止,並執行所有必要的清理以保持ejabberd的一致性。

我只要在模塊中創建一個導出函數shutdown/1,調用gen_fsm:send_all_state_event/2發送一個信號讓它終止。 至於每個連接都有一個c2s進程,我需要爲每個用戶調用這個函數。

--- UPDATING --- 其實沒有必要創建這個關機功能,ejabber_c2s已經處理「封閉」的信號,其中做同樣的事情的能力。因此,不要創建關閉函數,只需執行ge_fsm:send_event(C2SPid,closed)就足夠了。 --- UPDATING ---

要發現用戶的C2S進程PID我只是用ejabberd_sm:get_session_pid/1或ejabberd_sm:dirty_get_sessions_list/0(所有會話)。

這對我來說很好,但如果有人有更好的主意,請在這裏添加。

謝謝

0

我不知道ejabberd的細節,但是您可以編寫一個自定義XMPP組件來輪詢外部服務(或偵聽存在事件,如果它是另一個XMPP組件),然後在服務不可用時註銷用戶。

+0

自定義XMPP組件正是我所擁有的,關鍵是,我如何註銷客戶端?我不是XMPP/Ejabberd方面的專家,所以我想提醒我如何以編程方式註銷客戶端。 – RobisonSantos 2012-01-18 11:13:39