2017-06-01 27 views
0

我試圖找到一種方法來檢測用戶的最後一個窗口或選項卡正在關閉,所以我可以做一些清理;但我似乎無法找到一種方法來檢測它實際上是用戶的最後一個連接。我有一個跟蹤與我的頻道連接的模型,並且我不想在連接斷開時刪除用戶的連接記錄,前提是他們有其他活動選項卡打開連接。檢測最後一個窗口/ Tab關閉ActionCable

所以我需要檢查每個斷開連接,看看它們是否是具有相同標識符的其他活動連接。

我試着在disconnect方法中設置RemoteConnections的檢查。但是,當它被調用時,似乎關閉的連接仍然在RemoteConnections下返回。

module ApplicationCable 
    class Connection < ActionCable::Connection::Base 
    identified_by :current_user 

    def connect 
     self.current_user = find_verified_user 
     logger.add_tags 'ActionCable', current_user.username 
     logger.debug self.current_user.username + " now connected." 
    end 

    def disconnect 
     self.close() 
     logger.debug ActionCable.server.remote_connections.where(current_user: current_user) 
     logger.debug ActionCable.server.remote_connections.where(current_user: current_user).identifiers 
     logger.debug ActionCable.server.remote_connections.where(current_user: current_user).identifiers.inspect() 
    end 
end 

這種設置返回以下,即使使用該標識的最後一個連接關閉:

[ActionCable] [[email protected]] UserChannel stopped streaming from user:Z2lkOi8vYWxseWNoYXQvVXNlci80Nw 
[ActionCable] [[email protected]] #<ActionCable::RemoteConnections::RemoteConnection:0x00000007062690> 
[ActionCable] [swa[email protected]] #<Set:0x00000007791b78> 
[ActionCable] [[email protected]] #<Set: {:current_user}> 

我已經解決這一迄今爲止建立的模型只是爲了跟蹤他們的連接爲每個頻道打開和關閉。但是它增加了很多開銷,而且管理起來很麻煩。

任何人都可以提出一種方法來管理?我一直在搜索ActionCable的API文檔,並且空着。

回答

0

我發現了一個可能不適用於所有人的解決方案,但是因爲這些都是爲這個問題打開的幾個SO問題沒有答案,所以我想我會發布我最終的結果,也許它會幫助別人。

我放棄了查詢有線服務器來計算活動連接的想法。如果這是現在可能的話,我顯然不夠聰明,找不到答案。

我還嘗試使用Active Record來計算活動連接數,存儲GIDS以識別它們,並在最後一次連接關閉時進行清理。它的工作原理......但我不是粉絲,因爲它增加了大量額外的查詢,跟蹤訂閱的新模型以及對清理工作時間的敏感度。可能,但醜陋。

取而代之,我採用了「master」和「slave」連接的概念,以及一個額外的UserChannel(由我的用戶身份驗證驅動)。基本上,發起第一次訂閱的連接成爲「主」連接(對於聊天室來說,就我而言)。當主人加入時,我通過UserChannel向所有其他活動窗口/選項卡廣播一條通知,以通過相同用戶進行身份驗證。那些接收到這個廣播的人,通過在一個單獨的,但是配對的從屬頻道上建立連接來跟隨主連接。 「主」連接也建立了自己的匹配「從」連接。

所以每個聊天室我維持2個通道:room_#奴隸,房間 #_master

的聊天室活動的所有節目的「奴隸」通道發生(因爲它是可爲所有會話用戶,而只有一個窗口/標籤訂閱了主人)。新消息,用戶出口,入口等在這裏播出。

「主」通道僅用於處理設置和拆卸。當用戶加入時,主頻道的「訂閱」方法通過「從」頻道將該用戶的條目廣播給其他用戶。

當主連接關閉時,它的「取消訂閱」方法廣播出口,處理活動記錄清理,並向該用戶的所有從屬連接廣播消息以進入暫停狀態。然後,從站可以選擇(通過用戶操作)成爲新的主站連接,在這種情況下,連接將恢復。

這是我能找到的最好的平衡點;就ActiveRecord而言,只有一個窗口/選項卡用於連接。如果該窗口關閉,則用戶「離開」。但是,從屬頻道讓我可以在所有用戶的瀏覽器窗口/標籤中保持一個共同狀態,因爲它們仍然可以見證所有發送的廣播。如果用戶意外地關閉了「主」連接,他們有一條簡單的路徑重新加入。