2009-07-06 81 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 - 它非常好地完成异步作业+分叉演出。

相关问题