7

我正在尝试使用 Rails 4 Live Streaming 组件。除了看起来流保持打开并阻止新请求之外,这一切都有效。

关闭或单击应用程序中的新链接时,如何确保连接正确关闭?

这是我的现场活动控制器。

  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

数据库配置

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

我在带有 postgresql 9.2.x 的 Ubuntu 10.04 上使用 puma 作为独立的网络服务器(我没有需要 nginx 提供的繁重静态文件)。

4

2 回答 2

8

您必须更改开发环境设置才能启用此功能。

在您的 config/environments/development.rb 中添加或更改它:

config.cache_classes = true
config.eager_load = true

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

于 2013-09-06T16:22:22.660 回答
2

Puma 不应该阻塞,应该允许多个线程允许多个请求。

引导您了解代码中发生的情况。您当前在每个请求中使用此代码中的两个线程。请求进入的线程,以及用于保持打开连接的后台线程。

由于操作方法末尾的 ensure 块,您的连接将正确关闭。

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

您还可以研究另一台名为 Rainbows ( http://rainbows.rubyforge.org/index.html ) 的服务器,这是另一个非常好的用于开放请求的机架服务器。

这里还有一个与流线程相关的线程挂起https://github.com/rails/rails/issues/10989

于 2013-08-26T23:30:00.880 回答