[英]Rails 4 live stream + subscription based updates
我對使用ActionController :: Live和向用戶的流式通知有一些疑問。
我有一個用戶通知類,我的操作可以訂閱該類。 在我的用戶控制器的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.