2009-07-06 78 views
1

我想部署一個RoR應用程序,它執行一些異步任務。我使用workling,消息隊列是RabbitMQ。這個組合與Starling完美無瑕地工作,但我們決定更改MQ for Rabbit。 我讀的地方,我應該包括下面的代碼在我的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

編輯:自從發佈這個以來,我改進了下面的代碼。在這裏可以得到: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 - 它非常好地完成異步作業+分叉演出。