Как мой код Rails может определить, работает ли он на сервере (например, на тонком) или в rspec?

Оказывается, тонкий сервер очень требователен к запуску реактора EventMachine для себя. Это было бы хорошо, за исключением того, что есть обстоятельства, когда мне нужно запустить реактор, потому что процесс не запускается внутри тонкого.

Итак, простой вопрос: как я могу программно определить, что мое приложение Rails запускается тонким сервером? В таком случае я не буду запускать свой собственный реактор EventMachine, иначе придется.


person leei    schedule 24.06.2015    source источник


Ответы (1)


После прохождения инициализации как Rails, так и Thin выясняется, что действительно нет проникновения в экземпляр Application из Thin::Server. Похоже, это означает, что я не могу проверить свое приложение, чтобы увидеть, как на нем работает сервер.

Поэтому я просто решил проверить, определено ли Thin::Server. Поскольку у меня тонкая загрузка:

gem 'thin', require: false

Я собираюсь инициализировать класс Thin::Server только в том случае, если приложение запускается из тонкого. Я проверил консоль rails, задачи rake и воркеры delayed_jobs, и предположение кажется верным.

Итак, в моем application.rb:

# Start Faye...
config.middleware.delete Rack::Lock

thin_server = defined?(Thin::Server)

config.after_initialize do |app|
  Faye.logger = Rails.logger

  unless thin_server
    Faye.logger.debug "Ensure reactor running!"
    Faye.ensure_reactor_running!
  end
end

faye_params = {mount: '/faye', timeout: 25}
faye_params[:server] = 'thin' if thin_server

config.middleware.use FayeRails::Middleware, faye_params
person leei    schedule 24.06.2015
comment
Что, если я не использую Faye в качестве промежуточного программного обеспечения? Я запускаю его за балансировщиком AWS в контейнере ELB, поэтому я не могу использовать его в качестве промежуточного программного обеспечения. - person NeverBe; 27.06.2015