0

Rails 3.2 アプリを Thin サーバーで実行していて、application.rb で EventMachine を起動したい:

# application.rb

config.after_initialize do
  if ENV['EM']
    EM.run do
      host = '0.0.0.0'
      port = 3001

      # hit Ctrl + C to stop
      Signal.trap("INT")  { EventMachine.stop }
      Signal.trap("TERM") { EventMachine.stop }

      EventMachine::start_server host, port, SomeModule

      puts "EventMachine running on #{host}:#{port}. Ctrl + C to stop."
    end
  end
end

SomeModule には、ロードされている Rails に依存するコードがあります。そのため、これを初期化子ではなく after_initialize ブロックに入れました。

サーバーを(でrails s)起動すると、出力は正常に見えます:

=> Booting Thin
=> Rails 3.2.13 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
EventMachine running on 0.0.0.0:3001. Ctrl + C to stop.

しかし、ブラウザで localhost にアクセスすると、204 No Content応答が返されます。

これを引き起こすいくつかのことを考えることができますが、解決策ではありません:)

  • Railsアプリをブロックしている同じスレッドでEventMachineを起動しているのかもしれません。しかし、シンはこれを正しく処理する必要がありますか?
  • サーバーを別の方法で起動する必要があるかもしれませんが、それではどうすればよいでしょうか?
4

2 に答える 2

3

さらにグーグルで調べたところ、Thin を使用しているため、別の EventMachine を実行する必要がないことがわかりました。

私の after_initialize ブロックは次のようになります。

config.after_initialize do
  include SomeModule
end

そして SomeModule では、コードをEM.next_tickブロックでラップするか、「eventmachine not initialized: evma_connect_to_server (RuntimeError)」エラーが発生します。

Thin を使用して Rails アプリで EventMachine を使用するのは、思ったよりもずっと簡単でした :)

于 2013-05-19T16:36:27.317 に答える
0

EventMachine を呼び出す Ruby コードをオートロードしないようにする必要があります。そうしないと、メイン スレッドがブロックされます。スクリプトを lib/daemons に置いてから、EventMachine の起動スクリプトを作成し、それをデーモンとして使用します。すなわち:

#!/usr/bin/env ruby
# this is: ./scripts/my_daemon

require 'daemons'

options = {
  multiple: false,
  backtrace: true,
  app_name: 'my_daemon',
  dir_mode: :normal,
  dir: '/tmp/my_daemon',
  log_dir: '/tmp/my_daemon',
  log_output: true,
  ARGV: ARGV,
}

system "mkdir -p /tmp/my_daemons"
Daemons.run(File.join(File.dirname(__FILE__), '../lib/daemons/my_daemon.rb'), options)

「daemons」gem を Gemfile に追加する必要があります。

次にscript/my_daemon start、Rails ルートから実行します。さらにコマンドがあります:

  • script/my_daemon stop # デーモンを停止します
  • script/my_daemon run # フォアグラウンドで実行されるため、出力を確認してデバッグできます
  • script/my_daemon status # 何かが実行中かどうかを表示

ログインが表示されます/tmp/my_daemons/my_daemon.output

デーモンの詳細については、http: //daemons.rubyforge.org/Daemons.htmlをご覧ください。

于 2013-05-19T16:36:23.500 に答える