Вопрос

Я пытаюсь развернуть приложение RoR, которое выполняет некоторую асинхронную задачу.Для этого я использую Workling, а очередь сообщений — RabbitMQ.Эта комбинация работала безупречно со Старлингом, но мы решили изменить MQ на Кролика.Я где-то читал, что мне следует включить следующий код в свой файл Environment.rb.

require 'mq' 
if defined?(PhusionPassenger) 
  PhusionPassenger.on_event(:starting_worker_process) do |forked| 
    if forked 
      if EM.reactor_running? 
        EM.stop_event_loop 
        EM.release_machine 
        EM.instance_variable_set( '@reactor_running', false ) 
      end 
      Thread.current[:mq] = nil 
      AMQP.instance_variable_set('@conn', nil) 
    end 
    th = Thread.current 
    Thread.new{ 
      AMQP.connect(:host => 'localhost'){ 
        th.wakeup 
      } 
    } 
    Thread.stop 
  end 
end 

Но теперь Apache полностью терпит неудачу с сообщением:На сервере произошла внутренняя ошибка или неправильная конфигурация, и он не смог выполнить ваш запрос.

Это было полезно?

Решение

РЕДАКТИРОВАТЬ:После публикации я несколько улучшил приведенный ниже код.Доступна здесь: http://www.hiringthing.com/2011/11/04/eventmachine-with-rails.html

Я потратил миллион лет, пытаясь заставить это работать, и наконец сделал это.Вот мой код:

require 'amqp'
module HiringThingEM
  def self.start
    if defined?(PhusionPassenger)
      PhusionPassenger.on_event(:starting_worker_process) do |forked|
      if forked && EM.reactor_running?
          EM.stop
      end
      Thread.new {
      EM.run do
         AMQP.channel ||= AMQP::Channel.new(AMQP.connect(:host=> Q_SERVER, :user=> Q_USER, :pass => Q_PASS, :vhost => Q_VHOST ))
      end
      }
      die_gracefully_on_signal
      end
    end
  end

  def self.die_gracefully_on_signal
    Signal.trap("INT")  { EM.stop }
    Signal.trap("TERM") { EM.stop }
  end
end

HiringThingEM.start

Теперь я могу использовать:

EM.next_tick { AMQP.channel.queue(Q_Q).publish("hi mom") }

Внутри контроллеров моего приложения Rails.

Надеюсь, это кому-то поможет.

Другие советы

Не совсем ответ, но если вы не привержены AMQP, я бы рекомендовал использовать https://github.com/defunkt/resque - он очень хорошо выполняет асинхронную работу + разветвление.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top