2008-11-18 4 views
2

Я использую DRb в приложении Rails для выгрузки дорогостоящей задачи за пределы процесса Rails. Перед инициализацией заглушки клиента с помощью DRbObject.new необходимо инициализировать службу DRb с помощью DRb.start_service.Где правильное место для инициализации службы DRb в приложении Rails?

Выполнение этого в модели или контроллере, похоже, оставляет проблемы в неопределенном состоянии. Когда я выхожу дворняга он говорит:

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, отличную от той, которую использует mongrel.

# 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.

Смежные вопросы