2008-11-18 27 views
2

我在Rails應用程序中使用DRb來卸載Rails進程之外的昂貴任務。在使用DRbObject.new初始化客戶端存根前,需要使用DRb.start_service來初始化DRb服務。在Rails應用程序中,什麼地方可以初始化DRb服務?

在模型或控制器中執行此操作似乎會使線程處於不確定狀態。當我退出的雜種狗,它說:

Reaping 1 threads for slow workers because of 'shutdown' Waiting for 1 requests to finish, could take 60 seconds.

初始化中的environment.rb服務似乎正常工作有一個大的警告:我還使用backgroundrb一些鐵軌的工人。當它們初始化時,它們運行environment.rb並且由於雙重初始化而再次導致問題。

客戶端的DRb.start_service的正確位置在哪裏?或者,有沒有辦法測試初始化​​,這樣我就可以避免在同一個進程中執行兩次?

回答

3

以下代碼將檢查主服務器是否已處於活動狀態以避免雙重初始化。通過將DRb線程移動到一個與正在使用的雜種程序不同的ThreadGroup,可以避免雜種掛在出口處。

# start DRb service if it hasn't been started before 
    begin 
     DRb.current_server 
    rescue DRb::DRbServerNotFound 
     DRb.start_service 
     # move to different ThreadGroup to avoid mongrel hang on exit 
     ThreadGroup.new.add DRb.thread 
    end 

運行,這是使用前級(而不是在environment.rb中),得到最好的結果,似乎很好地工作backgroundrb。

相關問題