【问题标题】:Maintaining a single, persistent EM connection in a Sinatra app在 Sinatra 应用程序中维护单个持久的 EM 连接
【发布时间】:2012-02-28 21:22:44
【问题描述】:

我是一个 EventMachine 新手,所以我有可能完全错误地处理这个问题。我要做的是在应用程序启动时创建一个 EM 连接(实际上是一个 Blather 流,但那是一个 EM::Connection),然后我可以在需要时点击它。现在,我可以在这个 Sinatra 应用程序中正常工作的唯一方法是每次都创建一个新连接,该连接被包装在一个 EM.run 块中。

我一直在尝试确定 async_sinatra 是否会有所帮助。不过,我实际上并不关心请求是否异步发生。我想这会很好,但我仍然没有看到如何保持请求之间的连接。

在我的脑海中似乎最有意义的解决方案是在 Sinatra 配置块内的 EM 块中设置连接,但是我不知道以后如何访问它。不过,也许我缺少一些基本的东西。

附言这最终将在 Heroku 上运行,因此虽然我非常感谢任何见解,但已知可在 Heroku 上运行的解决方案将是最有用的。

编辑:

这似乎在做我想做的事,至少在本地:

class Dashboard < Sinatra::Base
  configure do
    Thread.start do
      EM.run do
        @@xmpp_stream = Blather::Client.setup('jid', 'password')
        @@xmpp_stream.connect
      end
    end
  end
end

【问题讨论】:

  • 你打算如何运行这个应用程序?如果您使用多个工人,您将为每个工人获得一个连接,这是一个问题吗?
  • 部署应用时,别忘了使用 Cedar 堆栈,因为 EventMachine 仅在该堆栈上受支持。

标签: ruby heroku sinatra eventmachine


【解决方案1】:

下面是一些开始:

require 'rack'
require 'sinatra/base'
require 'eventmachine'

class EMHandler < EM::Connection
  attr_reader :data

  def initialize(obj)
    @obj = obj
    @data = ""
  end

  def receive_data(data)
    @data << data
  end
end

class PersistentConnection
  def initialize(app, options = {})
    @app = app
    EM::next_tick do
      @server = EM::connect('127.0.0.1', 4000, EMHandler, self)
    end
  end

  def call(env)
    env['my_connection'] = @server
    @app.call(env)
  end
end

class Dashboard < Sinatra::Base
 get '/' do
   env['my_connection'].data
 end
end

use PersistentConnection
run Dashboard

这将在 localhost 上使用端口 4000 打开与服务器的持久连接,它将存储从它接收到的任何内容,并在通过 Web 浏览器请求索引页面时显示它。

将其保存在“config.ru”文件中并运行:

$ thin start -V

在我的情况下,端口 4000 上的服务器是(我在 mac os x 上,linux 也有):

$ nc -l 4000

只需将我打开的连接替换为您想要的即可。

【讨论】:

    猜你喜欢
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    相关资源
    最近更新 更多