EventMachine в Rails - где поставить цикл запуска? - PullRequest
1 голос
/ 17 декабря 2011

Я пытаюсь получить сервер EventMachine, который запускается при запуске моего сервера rails, а не как отдельный процесс.

Так, например, используя простой пример сервера из здесь (em-websocket) вы получаете следующий (автономный?) код рубина:

EventMachine.run {

EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 8080) do |ws|
    ws.onopen {
      puts "WebSocket connection open"

      # publish message to the client
      ws.send "Hello Client"
    }

    ws.onclose { puts "Connection closed" }
    ws.onmessage { |msg|
      puts "Recieved message: #{msg}"
      ws.send "Pong: #{msg}"
    }
end
}

Если я просто выполнил команду "rails new em-пример "Куда идет приведенный выше код в моем приложении rails 3?

Я бы предположил, что приведенный выше код в идеале должен работать в отдельном потоке (или волокне ..?), но я не уверен, как это выглядит.

Я видел, что это должно быть легко, если использовать «thin» в качестве моего веб-сервера.Heroku, кажется, использует это по умолчанию, и я установил «тонкий» гем, чтобы я мог также проверить его локально.

1 Ответ

1 голос
/ 17 декабря 2011

Возможно, вы захотите добавить свой код в инициализатор. Джон Нунемейкер опубликовал действительно интересную информацию о запуске EventMachine из-под Passenger в приложении Sinatra, и я полагаю, что он будет работать для вас аналогично.

Тем не менее, похоже, что вы просто пытаетесь заставить сервер веб-сокетов работать с Heroku. Теоретически, вы можете подумать, что работа со стеком Cedar и добавление нового типа процесса в ваш Procfile для сервера Websockets на основе EM приведут к его работе. Это будет выглядеть примерно так:

web:         bundle exec rails server -p $PORT
websocket:   bundle exec script/websocket_server $PORT

С скриптом / websocket_server, являющимся скриптом сервера сокетов вашего приложения, который может обрабатывать пользовательский аргумент порта.

К сожалению, однако, Heroku пока не поддерживает Websockets, как указано здесь , поэтому решение Procfile, скорее всего, не будет работать.

...