我有点像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
答案 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
只需将我打开的连接替换为您想要的连接。