Как лучше всего запускать и останавливать сервер Eventmachine из приложения Ruby on Rails? - PullRequest
4 голосов
/ 22 марта 2011

ИСПРАВЛЕНИЕ:

В частности, я хочу запустить и остановить EventMachine (EM) с контроллера Ruby on Rails.

(мне сказалиэтот «Thin» будет хорошо работать для этого.)

ПРИМЕЧАНИЕ: Этот EM-сервер ОТДЕЛЬНЫЙ от сервера Mongrel , на котором работает приложение Ruby on Rails.(Сервер EM принимает соединения от микроконтроллера Arduino.)

Запуск «Тонкого» в качестве сервера. Я ДОЛЖЕН иметь возможность принимать как HTTP-запросы, так и соединения Arduino.

# Starts Server
def start_control_server
    EventMachine::run {
        @EchoServer = EventMachine::start_server "0.0.0.0", 40013, EchoServer
    }
end

# Attempts ( fails ) to stop server
def stop_control_server
    EventMachine.stop_server(@EchoServer)
end

Если вы рекомендуете другие серверы ДРУГИЕ, чем обычные EventMachine, пожалуйста, предоставьте код для выполнения вышеуказанного кода.

Полный код контроллера доступен здесь: http://pastie.org/1698383

1 Ответ

1 голос
/ 01 апреля 2011

Я предполагаю, что вы не вызываете start_control_server и stop_control_server внутри другого метода контроллера.Это означает, что ваша переменная экземпляра (@EchoServer) не будет существовать при вызове stop.

Одним из решений может быть сохранение идентификатора, возвращенного из start_server, в сеансе.Как и в

  def start_control_server
    session[:em_server_id] = EventMachine::start_server "0.0.0.0", 4000, EchoServer
  end

  def stop_control_server
    EventMachine.stop_server(session[:em_server_id]) if session[:em_server_id]
    session[:em_server_id] = nil
  end

Кроме того, если вы запускаете приложение rails с использованием thin, то вы уже находитесь внутри цикла Eventmachine, поэтому вам не нужно вызывать EventMachine :: run.Вызов EventMachine.stop_server, по-видимому, не отключает ничего, что уже подключено, но мешает установлению дальнейших подключений к указанному порту.

Надеюсь, что некоторые из них используют!

...