سؤال

أحاول نشر تطبيق 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. - هل الوظيفة غير المتزامنة + شوكة أزعج بشكل جيد للغاية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top