Rails 4 - Live,即使刷新后连接仍在继续

时间:2013-07-04 16:26:29

标签: ruby-on-rails nginx websocket ruby-on-rails-4 rainbows

我已经创建了一个在Rails 4中使用Live方法的应用程序。但是当我使用它时,每次刷新都会继续进行一次连接,直到它达到与DB的最大连接数,然后才会挂起并永远加载。

如果用户刷新网站或决定退出连接,我该怎么做才能确保连接失效?

这是我的设置:

  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
    logger.info "Stream closed"
  ensure
    redis.quit
    response.stream.close
  end

我使用Nginx和Rainbows!在Ubuntu 10.04上。 Ruby 2.0.0-p195 PostgreSQL的 Rails 4

1 个答案:

答案 0 :(得分:0)

因此,如果您在自己创建的线程中执行该逻辑,我的答案就是将所有内容包装在内:

def events
  ActiveRecord::Base.connection_pool.with_connection do
    response.headers[etc
    #..
  end
end

现在,你没有制作自己的主题。根据你的症状,我怀疑可能会解决你的问题,看到它会很有趣。

但是,它可能不是必需的,因为ActionController :: Live是Rails官方支持的部分,文档和示例并没有说你应该做with_connection事。我不熟悉ActionController :: Live自己;听起来它可能是一个错误。在创建演示问题的尽可能小的应用程序之后,您可能希望使用Rails问题跟踪器进行归档。

我怀疑你的应用程序中有更多内容比你向我们展示的那样 - 你向我们展示的方法根本不使用ActiveRecord,所以没有理由采用任何数据库连接。或等待,通过'数据库连接'你真的是指Redis?如果是这样,那么忽略整个答案,就像我假设ActiveRecord一样。我也没有使用Redis的经验,但如果通过“数据库连接”表示Redis,那么这是Redis问题,您可能想尝试在Redis问题跟踪器上提交问题。或者,当然,至少标记这个问题“redis”,所以知道redis的人可能会看到它。