Поддержание единого постоянного соединения EM в приложении Sinatra

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

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

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

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

person farski    schedule 20.02.2012    source источник
comment
Как вы собираетесь запускать приложение? Если вы используете несколько воркеров, вы получите одно соединение для каждого воркера, это проблема?   -  person Schmurfy    schedule 28.02.2012
comment
При развертывании приложения не забудьте использовать стек Cedar, так как EventMachine поддерживается только в этом стеке.   -  person Dan Garland    schedule 10.05.2012


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

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

Сохраните это в файл «config.ru» и запустите с помощью:

$ thin start -V

В моем случае сервер на порту 4000 был (я на mac os x, на linux тоже есть):

$ nc -l 4000

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

person Schmurfy    schedule 28.02.2012