2013-07-07 2 views
0

У меня есть несколько вопросов, связанных с использованием ActionController :: Live и потоковых уведомлений для пользователей.Rails 4 прямой эфир + обновления на основе подписки

  1. Есть ли способ узнать, если или когда поток закрыт или не доступен для записи?
  2. Есть ли причина вручную закрыть поток в вашем действии? Я видел несколько примеров, когда они явно закрывали свой поток, но, наблюдая за браузером, кажется, что он справляется с этим для меня?

У меня есть класс уведомления пользователей, на который могут подписаться мои действия. В действии создания моего контроллера пользователя я говорю классу уведомлений для трансляции нового пользователя.

Чтобы облегчить это, мне пришлось оставить поток открытым. Я также не знаю, когда отказаться от подписки на уведомление пользователя, поскольку я не знаю, когда поток закрывается (через браузер, инициирующий его).

#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(...) 

... 

ответ

0

Вы можете использовать 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 
Смежные вопросы