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