2011-04-04 53 views
1

我想在rails應用程序啓動時自動啓動後臺線程,並在停止時終止它(Ctrl + C在dev模式或kill生產中的信號)如何在rails應用程序啓動時啓動線程並在終止時終止它

我在啓動時啓動我的線程並沒有問題,但我無法在停止時終止它。要麼它不停止,要麼阻止我的Rails應用程序退出。

是否有自動方式?或者我應該鉤住鐵軌停下來?怎麼樣 ?

在此先感謝您的建議。

P.S.順便說一句,你知道如何使用rails線程的「pid」功能嗎?我的意思是在啓動時將tmp/pid中的小文本文件放入並自動刪除。我相信有一些功能可以做到這一點。

回答

2

(老問題,但我不喜歡懸而未決的問題;-)

一個方便的方式做這是設置類似於軌道「初始化器」的「終結器」。然後可以在初始化器中啓動線程並在終結器中關閉它們。

  1. 創建 「配置/終結」 附近的 「配置/初始化」 目錄目錄。
  2. 把這個代碼在初始化:

(我們使用紅寶石「在退出」,參見Shutdown hook for Rails

at_exit do 
    finalizer_files = File.join(::Rails.root.to_s, "config/finalizers/*.rb") 
    Dir.glob(finalizer_files).sort.each do |finalizer_file| 
     require finalizer_file 
    end 
end 

3.然後我們可以使用類似的東西在「終結」 (在這裏我們試圖阻止「工」初始化理應推出)

if Settings.web_app.engine.workers_count != 0 && Settings.web_app.engine.auto_manage_workers then 
    puts ' * Automatic shutdown of workers' 
    ... 
end 
1

您是否嘗試過在這樣的begin..ensure包裹你的應用程序:

begin 
    thread = start_thread 
    rest_of_app 
ensure 
    thread.kill 
end 
+0

謝謝你,但我覺得不好的開始..最終包裝我的Rails應用程序。一定會有更好的辦法。 – Offirmo 2011-04-05 07:54:58

相關問題