Потокобезопасные рабочие восстановления в JRuby при развертывании как WAR - PullRequest
5 голосов
/ 29 апреля 2011

В настоящее время мы используем Resque в JRuby и используем два способа запуска Worker при разработке.

  • Использование Rake:
QUEUE=* jruby -J-cp /path/to/library -S rake environment resque:work
  • Программно, инициализируется с помощью приложения Sinatra Rack (или чего-то еще), в конце концов вызывая класс с:

def start
   @worker = Resque::Worker.new(@queues)
   @worker.verbose = @vervose
   @worker.work(@interval)
end

def stop
   @worker.try(:shutdown)
end

Хотя оба эти решения приемлемы для нас в разработке. Я обеспокоен тем, как это будет работать при развертывании, например, в Tomcat.

Обычно в Ruby вы бы порождали или демонизировали рабочих, а затем использовали инструмент мониторинга для наблюдения за pid.

Имеет ли смысл запускать Workers программно при развертывании? Мне интересно, если он запускает новый поток в Java или мешает процессу jruby, если нет, я должен использовать еще одну библиотеку планирования, как кварц, чтобы запустить работника? или грабли, запускаемые при развертывании?

Я мог бы создать модель «Рабочий» и затем отслеживать работники в БД, но для меня это не имеет смысла.

Любая помощь или знания будут оценены.

Спасибо.

Refs:

https://github.com/defunkt/resque

http://rubydoc.info/github/defunkt/resque/master/Resque/

http://blog.thomasmango.com/post/636319317/resque-in-production

https://gist.github.com/486161

Ответы [ 2 ]

0 голосов
/ 31 октября 2012

Более чем через год, но я думаю, что ответ, который вы искали, - это запустить сотрудников Resque вместе с вашим приложением в (нативных) потоках Java. Поскольку вы используете JRuby :: Rack, ответом будет JRuby :: Rack :: Worker . Добавьте это к вашему web.xml :

<context-param>
  <param-name>jruby.worker</param-name>
  <param-value>resque</param-value>
</context-param>
<!--
<context-param>
  <param-name>QUEUES</param-name>
  <param-value>mails,posts</param-value>
</context-param>-->

<listener>
  <listener-class>org.kares.jruby.rack.WorkerContextListener</listener-class>
</listener>

Если вы не уверены, есть web.xml.erb sample https://github.com/kares/jruby-rack-worker, просто создайте config / web.xml.erb и скопируйте содержимое это ... Если вы используете Trinidad, то на его основе встроено расширение (поэтому вам не нужно настраивать web.xml и копировать файл .jar).

0 голосов
/ 12 июля 2011

Использование rake resque:work загрузит вашу среду Rails и запустит одного работника, который опрашивает работу, переходит в (суб) рабочий процесс, обрабатывает эту работу и затем завершает работу.

Если вы хотите запустить несколько рабочих, используйте переменную COUNT:

QUEUE=* COUNT=5 jruby -J-cp /path/to/library -S rake environment resque:work

Какой аспект этого будет развернут в Tomcat? Это все командная строка.

...