2010-12-08 2 views
13

Я использую JRuby 1.5.6 на Rails, чтобы создать приложение, которое будет периодически уходить и получать любые подкасты RSS, которые я подписал.jruby on rails варианты планирования

Я выбрал JRuby в первую очередь потому, что я знаком с Java, хочу использовать структуру Rails и, самое главное, я могу выполнять задачи «тяжелого подъема» на Java, когда Ruby не соответствует моим требованиям. До сих пор (и я все еще на ранних стадиях развития) этот гибридный подход работает очень хорошо.

Я сейчас в точке, где мне необходимо реализовать планирование периодических и длительных задач для фонового процесса. Мои требования состоят в том, чтобы иметь систему планирования базы данных, которая, в идеале, хорошо документирована, в настоящее время поддерживается и очищается.

Моя проблема заключается в том, что после многих дней исследований, подходящих для самодельных упакованных решений, у меня, похоже, осталось очень мало вариантов из-за моего использования JRuby.

Некоторые из драгоценных камней, которые я пробовал ...

Руфус планировщик

Использовав это, прежде чем я доволен его интерфейс и документация, однако существует недостаток упорства базы данных, следовательно, прерыватель транзакции для моих требований.

delayed_job

Мой идеальным решением было бы delayed_job. Однако хорошая документация, поддерживаемая и поддерживаемая базами данных, ломается под JRuby из-за отключения ObjectSpace (однако мы можем исправить это путем повторного включения), но более смертельно зависимость от драгоценных камней демонов, которая бросает «вилку», является небезопасной и отключенной по умолчанию на JRuby "из-за ограничений в реализации JRuby.

На github есть вилка, которая не имеет зависимости от демонов, однако я не доволен переходом на вилку с главной ветвью разработки, и мне по-прежнему остается проблема ObjectSpace, в которой я не уверен что касается его воздействия на производительность.

кварц-JRuby

Хотя были различные кварцевые камни, основанные прежде, this very recent offering еще одна попытка обеспечения скользкий рубиново-подобный интерфейс. Существует, однако, минимальная документация, и я не уверен, что, если это может быть поддержано базой базы данных, мое чувство кишки состоит в том, что это не так.

Проблема

В то время как я только подчеркнул 3 варианта здесь, я знаю, что есть другие доступные. Я, однако, не смог найти решение для отметки всех 3 блоков требований (документы, поддерживаемые, поддерживаемые базами данных).

Так вопросы ...

Кто-нибудь еще был в такой ситуации и придумать решение?

Неужели кому-нибудь удалось заставить delayed_job работать в любой форме?

Есть ли какие-либо лучшие решения там, которые я забыл и буду удовлетворять моим потребностям?

+1

** Обновление ** Я думал, что стоит опубликовать окончательное решение, которое я решил использовать с JRuby, теперь в 1.7.2. Моя текущая настройка использует Sidekiq и Clockwork. Это оказалось надежным долгосрочным решением. – 2013-01-22 01:06:29

ответ

4

Мы используем delayed_job (collectidea/v1.8.4) под JRuby в производстве уже более года. Мы не включили ObjectSpace, и мы также не используем драгоценный камень демонов.

создал простую Rake задачу

namespace :product do 
    desc "Start Delayed Job Worker" 
    task :dw => :environment do 
     Delayed::Worker.new.start 
    end 
    end 

и демон его в OS зависимого пути. На linux,

nohup jruby -S rake product:dw > $log_dir/delayed_job_console.log 2>&1 & 
+1

Я думаю, что это похоже на запуск , как вы можете видеть в [..]/gems/delayed_job-3.0.3/lib/delayed/tasks. rb -> task: work =>: environment do Delayed :: Worker.new (: min_priority => ENV ['MIN_PRIORITY'],: max_priority => ENV ['MAX_PRIORITY'],: queues => (ENV ['QUEUES '] || ENV [' QUEUE '] ||' ') .sp lit (', '),: quiet => false) .start – 2012-10-15 01:29:16

4

Я бы порекомендовал resque в качестве системы массового обслуживания. Resque похож на DelayedJob, но, на мой взгляд, намного лучше. Это было developed at GitHub and is used as their queueing system. Я также использую его в производстве почти год, и я был очень доволен этим.

У Resque определенно есть поддержка JRuby, и все, что вам нужно сделать, чтобы получить запланированные задания, имеет простой планировщик. Некоторые рекомендуют resque-scheduler, хотя мне нравится держать его простым и использовать clockwork, который имеет красивую DSL для написания простых задач, связанных с cron, для очереди планировщиков (см .: clockwork README). При этом, вы можете просто планировать такие вещи, как так:

every(1.hour, 'tasks.alert') { Resque.push(:cron, :class => 'TaskAlert', :args => []) } 
2

Проверить https://github.com/kares/jruby-rack-worker Это позволяет delayed_job решение в среде, JRuby. Работа продолжается. На момент написания статьи, мой опыт заключается в том, что он отлично работает с одним работником. Хотя у меня возникают трудности при запуске дополнительных рабочих.

+0

Работал нормально, но затем он блокируется каждый раз. Есть ли у вас какие-либо идеи? – 2012-07-12 21:23:16

1

Первоначально я задал этот вопрос в декабре 10 и с тех пор разработал решение, которое, как я думал, стоит опубликовать для других.

Как указывали другие, можно получить библиотеки, такие как delayed_job, работающие с JRuby, и для некоторых это может быть приемлемым решением. Я, однако, не хотел решения, требующего дополнительного процесса, и с учетом этого я разработал камень, который использует инфраструктуру Executor Java и интегрирует его с ActiveRecord.

Результатом является acts_as_executor, который позволяет приложению Rails 3.x взаимодействовать с исполнителями и задачами (которые будут выполняться в надлежащем потоке Java) так же, как и любая другая модель ActiveRecord.

Я недавно перенес драгоценный камень, чтобы освободить кандидата 1. Взгляните на GitHub и Rubygems.

N.B. По умолчанию по умолчанию на странице RubyGems по-прежнему отображается бета-версия. Однако rc1 все еще является последним релизом.

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