2016-12-04 4 views
0

狂ってしまっ私はconfig/application.rbに次のコードを持っている:Railsの初期化子から5出発スレッドが

config.after_initialize do 
    MyConcern.init_processing 
end 

そして、次の関連メソッド:

def init_processing 
    @queue_processor = Thread.new do 
    process_op_queue 
    end 
    @queue_processor.name = "Some Queue" 
    # @queue_processor_notifier = Queue.new 
end 

def process_op_queue 
    while true 
    req = MyRequest.where(done: Helper::FALSE_NIL_OR_MISSING, started_at: nil).order_by(id: :asc).find_one_and_update({'$currentDate' => {started_at: true}}, return_document: :after) 
    req ? process_queue_item(req) : sleep(30) 
    end 
end 

は、基本的にはいくつかの背景を実行するために、サーバーの起動時にスレッドを開始アプリケーションからHTTP呼び出しによって受け入れられたタスク。

開発モードではすべて正常に動作します。同じピューマサーバと生産ENVでの実行、@queue_processorは(レールコンソールから)死んで示しています

MyConcern.instance_variable_get("@queue_processor").join 
=> #<Thread:[email protected] [email protected]/var/lib/openshift/5842d71a5110e25cdf00000c/app-root/runtime/repo/app/controllers/concerns/my_concern.rb:23 dead> 
MyConcern.instance_variable_get("@queue_processor").value 
=> false 

まず、それはスレッドが例外なく死ぬことができるか私には非自明な(穏やかに言った)であるとしてfalseを返します上記のループはprocess_op_queueにあります。

  1. 実際に私は一つだけを見るのアプリへのリクエストを行うと、レールコンソールでデータベース
  2. に変更内容を見ながら、私には明らかなように仕事をしているスレッドがあります:他の非常に興味深い事実があることですスレッド:

2.3.1 :009 > Thread.list 
=> [#<Thread:0x000000012f63a8 run>] 
2.3.1 :010 > 

アプリケーションの一部がキュープロセッサスレッドをチェックしていて、エラーが報告されているので、死んでいると実際にそのロジックが壊れています。いずれも問題をデバッグして解決する方法をアドバイスしていただければ幸いです。ありがとうございました。

答えて

0

ピューマ及び労働者について読んで、労働者をforkしながら、ピューマが何をしているかの魔法私には不明のようだ、などは、だからためにrakeタスクを作成することを決定することになった:

rails g task mynamespace process_queue 

その後lib/tasks/mynamespace.rakeにコードを置きますプロセッサを起動するために必要な:

その後、別のアプリケーションスレッドではなく別のプロセスとして開始します。これは、私が好きなだけ多くのプロセッサーと多くのコンテナーを実行することを可能にします。レーキタスクの良いことは、アプリケーション自体のようにすべての動作を持つことです。つまり、MyModel.somethingはアプリ内で自動的に動作します。

nohup bin/rails mynamespace:process_queue > my.log 
関連する問題