【发布时间】:2013-07-07 13:37:35
【问题描述】:
我有几个关于使用 ActionController::Live 和向用户发送流通知的问题。
- 有没有办法判断流是否/何时关闭或不再可写?
- 是否有理由在您的操作中手动关闭流?我看过一些他们会明确关闭流的示例,但是看着浏览器,它似乎为我处理了这些?
我有一个我的操作可以订阅的用户通知类。在我的用户控制器的创建操作中,我告诉通知类广播新用户。
为了方便起见,我不得不让信息流保持打开状态。我也不知道何时取消订阅用户通知,因为我不知道流何时关闭(通过浏览器启动它)。
#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(...)
...
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-4 live-streaming