У меня есть несколько вопросов, связанных с использованием ActionController :: Live и потоковых уведомлений для пользователей.Rails 4 прямой эфир + обновления на основе подписки
- Есть ли способ узнать, если или когда поток закрыт или не доступен для записи?
- Есть ли причина вручную закрыть поток в вашем действии? Я видел несколько примеров, когда они явно закрывали свой поток, но, наблюдая за браузером, кажется, что он справляется с этим для меня?
У меня есть класс уведомления пользователей, на который могут подписаться мои действия. В действии создания моего контроллера пользователя я говорю классу уведомлений для трансляции нового пользователя.
Чтобы облегчить это, мне пришлось оставить поток открытым. Я также не знаю, когда отказаться от подписки на уведомление пользователя, поскольку я не знаю, когда поток закрывается (через браузер, инициирующий его).
#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(...)
...