Поддержание единого постоянного соединения EM в приложении Sinatra - PullRequest
2 голосов
/ 20 февраля 2012

Я немного новичок в EventMachine, так что есть шанс, что я подхожу к этому совершенно неправильно. То, что я пытаюсь сделать, - это создать EM-соединение (на самом деле поток Blather, но это EM :: Connection) один раз при запуске приложения, которое я могу подключить, когда мне это нужно. Прямо сейчас, единственный способ, которым я могу Blather работать правильно в этом приложении Sinatra, - это каждый раз создавать новое соединение, заключенное в блок EM.run.

Я пытался определить, поможет ли async_sinatra. На самом деле мне все равно, если запросы происходят асинхронно. Полагаю, это было бы неплохо, но я все еще не понимаю, как бы я сохранил связь между запросами.

Решение, которое кажется мне наиболее разумным, состоит в том, чтобы установить соединение в EM-блоке внутри блока Sinatra configure, но тогда я не уверен, как получить к нему доступ в будущем. Возможно, я что-то упускаю из виду.

p.s. Это в конечном итоге будет работать на Heroku, поэтому, хотя я был бы очень признателен за любую информацию, решения, которые, как известно, работают на Heroku, будут наиболее полезными.

Edit:

Кажется, это делает то, что я хочу, по крайней мере локально:

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 Ответ

1 голос
/ 28 февраля 2012

Вот с чего начать:

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

Это откроет постоянное соединение с сервером на локальном хосте с портом 4000, оно сохранит все полученные от него данные и отобразит их при запросе страницы индекса через веб-браузер.

Сохраните это в файле config.ru и запустите с:

$ thin start -V

В моем случае сервер на порту 4000 был (я на Mac OS X, Linux также есть):

$ nc -l 4000

Просто замените открываемое соединение тем, что вы хотите.

...