2016-12-04 43 views
0

我在config/application.rb下面的代碼:滑軌從初始化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與同PUMA服務器運行時,@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 

首先,它是(溫和地說)不明顯,我一個線程怎麼能沒有異常死亡,並傳回假我在process_op_queue以上的循環。另一個很有趣的事實是:

  1. 實際上有一個線程做的工作爲明顯,我一邊做請求的應用程序,並期待在數據庫
  2. 在軌臺什麼樣的變化我看到的只有一個線程:

。該應用程序的

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

部分是檢查隊列處理器線程和報告與它這樣顯示出來是死是真正打破了邏輯錯誤。任何建議如何調試和解決這個問題,將不勝感激。謝謝。

回答

0

閱讀有關美洲獅和工人看來我不清楚是什麼魔力是彪馬這樣做,而分叉工人等,所以最終決定創建一個耙任務是:

rails g task mynamespace process_queue 

然後放入lib/tasks/mynamespace.rake代碼

namespace :mynamespace do 
    desc "Process reuqest queue" 
    task process_queue: :environment do 
    MyConcern.process_op_queue 
    end 
end 

然後啓動此作爲一個單獨的過程,而不是一個單獨的應用程序的線程:啓動處理器所需要。這使得可以運行儘可能多的處理器,並可以按照我喜歡的方式運行多個容器。 rake任務的好處在於它具有與應用程序本身一樣的所有行爲。這意味着MyModel.something會自動在應用程序內工作。

nohup bin/rails mynamespace:process_queue > my.log