2009-07-06 22 views
1

いくつかの非同期タスクを実行するRoRアプリケーションを配備しようとしています。私はそれを使用して、メッセージキューはRabbitMQです。この組み合わせはStarlingと完璧に連携しましたが、私たちはRabbitのMQを変更することに決めました。 は、私は私のenvironment.rbにPhusion Passenger + WorkBling + 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を使用することをお勧めします - それは非同期ジョブ+フォークギグをうまく行います。

関連する問題