2009-07-06 4 views
1

Я пытаюсь развернуть приложение RoR, которое выполняет некоторую асинхронную задачу. Я использую для этого работу, а очередь сообщений - RabbitMQ. Эта комбинация работала безупречно с Starling, но мы решили изменить MQ для Кролика. я где-то читал, что я должен включить следующий код в моем environment.rbPhusion Passenger + Workling + RabbitMQ

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 полностью завершается с сообщением: Сервер обнаружил внутреннюю ошибку или некорректное и не смог выполнить ваш запрос

ответ

1

EDIT: Я немного улучшил код ниже, разместив его. Доступно здесь: 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.

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

1

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