在Sinatra应用程序中维护单个持久的EM连接

时间:2012-02-20 19:04:32

标签: ruby heroku sinatra eventmachine

我有点像EventMachine新手,所以我有可能接近这个完全错误。我想要做的是在应用程序启动时创建一个EM连接(实际上是一个Blather流,但这是一个EM :: Connection),然后我可以随时打开它。现在,我可以在这个Sinatra应用程序中正确使用Blather的唯一方法是每次创建一个新连接,它包含在EM.run块中。

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

似乎在我的大脑中最有意义的解决方案是在Sinatra配置块内的EM块中设置连接,但是后来我不确定如何访问它。也许我错过了一些基本的东西。

P.S。这最终将在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

1 个答案:

答案 0 :(得分: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

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