簡體   English   中英

Rails 4實時流+基於訂閱的更新

[英]Rails 4 live stream + subscription based updates

我對使用ActionController :: Live和向用戶的流式通知有一些疑問。

  1. 有沒有辦法判斷流何時/何時關閉或不再可寫?
  2. 是否有必要在操作中手動關閉流? 我已經看到了一些示例,它們明確地關閉了流,但是看着瀏覽器,似乎它可以為我處理這些事情?

我有一個用戶通知類,我的操作可以訂閱該類。 在我的用戶控制器的create動作中,我告訴通知類廣播新用戶。

為了簡化此操作,我不得不將流保持打開狀態。 我也不知道何時取消訂閱用戶通知程序,因為我不知道流何時關閉(通過瀏覽器啟動它)。

#EventsController
def users
    response.headers['Content-Type'] = 'text/event-stream'
    sse = SSE.new(response.stream)
    sse.write({}, event: :init)
    UserNotifier.sub { |user| sse.write({ name: user.name, id: user.id }, event: :new_user ) }
  end

因此,這只會使持久連接保持打開狀態,然后一旦某個事件觸發了UserNotifier上的廣播消息,它的任何子床都會觸發該消息。

唯一的問題是,我不知道什么時候退訂,在我的區塊中,您看到我只是顯式調用sse.write(包裝響應流),而后者又盲目地調用stream.write而不知道其狀態。

更新

我注意到有些人搶救了IOError異常,以告知客戶端何時斷開連接。 那真的是最好的方法嗎?

rescue IOError
    UserNotifier.unsub(...)

...

您可以使用ensure確保一旦寫入失敗或連接關閉或發生故障后流就被關閉:

def your_action
  response.headers['Content-Type'] = 'text/event-stream'

  begin
    # Do your writing here: response.stream.write("data: ...\n\n")
  rescue IOError
    # When the client disconnects, writing will fail, throwing an IOError
  ensure
    response.stream.close
  end
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM