Jruby on rails варианты планирования

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

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

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

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

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

планировщик rufus

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

delayed_job

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

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

кварц-JRuby

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

Проблема

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

Итак, вопросы...

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

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

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

Ответы

Ответ 1

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

Создал простую задачу рейка

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

и демонзировать его в зависимости от ОС. В linux

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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

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

Недавно я перенял камень для выпуска кандидата 1. Посмотрите GitHub и Rubygems.

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