2013-07-07 2 views
0

ActionController :: Live 및 스트리밍 알림을 사용자에게 사용하는 것과 관련하여 몇 가지 질문이 있습니다.Rails 4 라이브 스트림 + 구독 기반 업데이트

  1. 스트림이 닫혀 있거나 더 이상 쓸 수없는 경우를 알 수있는 방법이 있습니까?
  2. 작업 중에 수동으로 스트림을 닫아야하는 이유가 있습니까? 명시 적으로 스트림을 닫을 몇 가지 예를 보았지만 브라우저를 보면서 그것이 나를 위해 처리하는 것 같습니다.

내 작업을 구독 할 수있는 사용자 알림 클래스가 있습니다. 내 사용자 컨트롤러의 생성 작업에서 알림 클래스에 새 사용자를 브로드 캐스트하도록 지시합니다.

이 작업을 용이하게하기 위해 스트림을 열어 두어야했습니다. 또한 스트림이 닫힐 때 (브라우저를 시작하여 알 수 없음) 사용자 알리미를 구독 취소 할 시점을 알 수 없습니다. 그것은 블록은 트리거의 것에 뭔가가 UserNotifier에 브로드 캐스트 메시지를 트리거하면

#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 

그래서 이것은 단지 다음 열고 영속적 인 연결을 잎, 하나는 자막도.

유일한 문제는 구독 취소시기를 알 수없고 내 블록에서 명시 적으로 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