ActionController :: Live是否可以检查连接是否仍然存在?

时间:2013-01-10 22:47:18

标签: ruby-on-rails publish-subscribe event-stream

我正在尝试使用Rails 4的直播实现文本/事件流。它工作得很好,我遇到的唯一麻烦就是我无法在不发送任何消息的情况下检查连接是否存在。

我想出的唯一解决方案是使用循环刻度生成器创建支持通道,以便某些后台任务将定期发送消息。但它似乎是凌乱和不可靠的。更好的解决方案?

这是我的控制器:

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

1 个答案:

答案 0 :(得分:10)

好的,我找到了两个选择:

1)有趣但不好(因为我没有得到什么服务器应该用来处理1000的并行连接):

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)太棒了。使用Goliath服务器。原来,它可以检查连接是否丢失没有任何自动收报机。在前往歌利亚的途中发现了Cramp。它很轻巧,希望很快,但似乎被放弃了。