2009-07-06 15 views
1

Ich versuche, eine RoR app zu implementieren, die eine asynchrone Aufgabe tut. Ich benutze workling für das und die Nachrichtenwarteschlange ist RabbitMQ. Diese Kombination funktionierte einwandfrei mit Starling, aber wir beschlossen, die MQ für Kaninchen zu ändern. Ich habe irgendwo gelesen, dass ich den folgenden Code in meinem environment.rbPhusion Passagier + 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 

Aber das jetzt Apache nicht vollständig mit der Meldung enthalten soll: Der Server hat einen internen Fehler oder eine falsche Konfiguration festgestellt und konnte Ihre Anfrage abzuschließen

Antwort

1

EDIT: Ich habe den Code unten etwas verbessert dies seit der Veröffentlichung. Erhältlich hier: http://www.hiringthing.com/2011/11/04/eventmachine-with-rails.html

Ich verbrachte nur milliioon Jahren versucht, dies zu Arbeit zu bekommen, und schließlich tat. Hier ist mein Code:

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 

Jetzt kann ich verwenden:

EM.next_tick { AMQP.channel.queue(Q_Q).publish("hi mom") } 

Innerhalb der Controller meiner Rails-Anwendung.

Ich hoffe, das hilft jemandem.

1

nicht wirklich eine Antwort, aber es sei denn, Sie zu AMQP verpflichtet sind, würde ich empfehlen https://github.com/defunkt/resque verwenden - es macht den asynchronen Job + Gabel Gig sehr schön.

Verwandte Themen