phusion الركاب + أعمال + الأرنب
-
23-08-2019 - |
سؤال
أحاول نشر تطبيق ROR يقوم ببعض المهمة غير المتزامنة. يمكنني استخدام العمل لهذا وقتك قائمة انتظار الأرانب. عمل هذا المزيج بلا عيوب مع الزرزور ولكن قررنا تغيير MQ للأرنب. قرأت في مكان ما يجب أن أدرج التعليمات البرمجية التالية في بيئتي
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.hiringthingthing.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") }
داخل وحدات التحكم في تطبيق القضبان الخاصة بي.
أمل أن هذا يساعد شخصاما.
نصائح أخرى
ليس حقا إجابة، ولكن ما لم تكن ملتزمة AMQP، أود أن أوصي باستخدام https://github.com/defunkt/resque. - هل الوظيفة غير المتزامنة + شوكة أزعج بشكل جيد للغاية.