2013-08-05 4 views
7

레일 4 라이브 스트리밍 구성 요소를 사용하려고합니다. 스트림이 열린 상태로 유지되고 새로운 요청을 차단하는 것 외에는 모두 작동합니다.레일 4, 라이브 스트리밍, 열어두기, 요청 차단

응용 프로그램 내에서 새 링크를 닫거나 클릭 할 때 연결이 제대로 닫히도록하려면 어떻게해야합니까?

이것은 내 라이브 이벤트 컨트롤러입니다.

def events 
    response.headers["Content-Type"] = "text/event-stream" 
    redis = Redis.new 
    redis.psubscribe("participants.*") do |on| 
     on.pmessage do |pattern, event, data| 
     response.stream.write("event: #{event}\n") 
     response.stream.write("data: #{data}\n\n") 
     end 
    end 
    rescue IOError 
    ensure 
    redis.quit 
    response.stream.close 
    end 

내가 PostgreSQL의 9.2.x. 우분투 10.04에 (내가 Nginx에 의해 제공 될 필요가 무거운 정적 파일이없는) 독립형 웹 서버로 퓨마를 사용하고

production: 
    adapter: postgresql 
    encoding: unicode 
    database: ************ 
    pool: 1000 
    username: ************ 
    password: ************ 
    timeout: 5000 

데이터베이스의 conf

+0

를 참조 혹시이 문제를 해결할 수 있었습니까? Dan의 대답은 진행되는 일에 대한 좋은 요약이지만 질문에 대한 대답은 아닙니다 (나는 당신이 그것을 받아들이지 않았기 때문에 당신을 위해서도 생각합니다). –

+1

@Teeg 쓴대로 좋은 요약이지만 내 질문을 해결하지 못했습니다. 나는 대신 Faye를 사용하여 끝냈다. 나는 이것이 제대로 작동하기를 원했기 때문에 슬프다. – Philip

+1

그다지 나쁘다. Goofy 솔루션이 포함 된 [유사한 질문] (http://stackoverflow.com/q/18970458/877472)을 게시했습니다. 내가 알아 내면 알려주지. –

답변

2

푸마가 차단되어서는 안되며 여러 스레드가 여러 요청을 허용 할 수 있어야합니다.

코드에서 어떤 일이 일어나고 있는지 살펴 봅니다. 요청 당이 코드에서 현재 두 개의 스레드를 사용 중입니다. 요청이 들어온 스레드와 연결을 유지하는 데 사용되는 백그라운드 스레드

조치 방법의 마지막에 확인 블록으로 인해 연결이 제대로 종료됩니다.

def events 
    response.headers["Content-Type"] = "text/event-stream" 
    redis = Redis.new 
    # blocks the current thread 
    redis.psubscribe("participants.*") do |on| 
    on.pmessage do |pattern, event, data| 
     response.stream.write("event: #{event}\n") 
     response.stream.write("data: #{data}\n\n") 
    end 
    end 
    # stream is on a background thread and will remain open until 
    # redis.psubscrie exits. (IO Error, etc) 
rescue IOError 
ensure 
    redis.quit 
    response.stream.close 
end 

또한 공개 요청에 대한 또 다른 아주 좋은 랙 서버 인 다른 서버라는 무지개 (http://rainbows.rubyforge.org/index.html)를 조사 할 수있다. 여기

또한이 기능을 사용하기 위해 개발 환경 설정을 변경해야 https://github.com/rails/rails/issues/10989

8

매달려 스트리밍 스레드와 관련된 스레드입니다.

추가 또는 설정/환경/development.rb에서 변경할 :

config.cache_classes = true 
config.eager_load = true 

http://railscasts.com/episodes/401-actioncontroller-live?view=asciicast

+1

제가 프로덕션 환경 에서이 문제가 아니라 개발 ... – Philip

+0

이것은 실제로 내 문제를 해결합니다. 많은 감사합니다. –