ruby-on-rails publish-subscribe event-stream

ruby on rails - ActionController:: LIve ¿Es posible verificar si la conexión aún está activa?



ruby-on-rails publish-subscribe (1)

Ok, he encontrado dos opciones:

1) Divertido pero no bueno (ya que no obtuve el servidor que debo usar para manejar miles de conexiones paralelas):

begin ticker = Thread.new { loop { sse.write 0; sleep 5 } } sender = Thread.new do redis.subscribe(:info, :chat) do |on| on.message do |event, message| sse.write(message, :event => event.to_s) end end end ticker.join sender.join rescue IOError ensure Thread.kill(ticker) if ticker Thread.kill(sender) if sender track.close sse.close end

2) Impresionante. Para utilizar el servidor Goliath. Resultó que puede verificar si la conexión se pierde sin ningún ticker. En el camino a Goliat encontramos calambre. Es ligero y, con suerte, rápido, pero parece ser abandonado.

Estoy tratando de implementar la transmisión de texto / eventos usando la transmisión en vivo de Rails 4. Funciona muy bien y el único problema que encontré es que no puedo comprobar si la conexión está activa sin enviar ningún mensaje.

La única solución que descubrí es crear un canal de apoyo con un generador de tick cíclico, de modo que alguna tarea en segundo plano envíe mensajes allí periódicamente. Pero parece ser desordenado y no confiable. ¿Alguna solución mejor?

Aquí está mi controlador:

require ''persistency/sse'' require ''persistency/track'' class PersistencyController < ApplicationController include ActionController::Live def stream response.headers[''Content-Type''] = ''text/event-stream'' sse = Persistency::SSE.new(response.stream) track = Persistency::Track.new(current_user) redis = Redis.new begin redis.subscribe(:info, :chat) do |on| on.message do |channel, message| sse.write({ :message => message }, :event => channel) end end rescue IOError ensure track.close sse.close end end end