我正在尝试部署一个执行一些异步任务的RoR应用程序。我对此使用了工作,消息队列是RabbitMQ。这种组合在Starling上工作得无懈可击,但我们决定更改Rabbit的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完全失败,并显示以下消息:服务器遇到内部错误或配置错误,无法完成您的请求
发布于 2011-10-13 09:00:58
编辑:自从发布了这篇文章后,我对下面的代码进行了一些改进。可在此处获得: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应用程序的控制器中。
希望这对某些人有帮助。
发布于 2011-03-04 21:21:32
不是一个真正的答案,但除非你致力于AMQP,否则我会推荐使用https://github.com/defunkt/resque -它可以很好地完成异步任务+分支任务。
https://stackoverflow.com/questions/1089391
复制相似问题