jruby on rails调度选项

时间:2010-12-08 16:09:47

标签: jruby scheduling jrubyonrails

我在Rails上使用JRuby 1.5.6来构建一个应用程序,它会定期消失并检索我订阅过的任何RSS播客。

我选择JRuby主要是因为我熟悉Java,希望利用Rails框架,最重要的是,当Ruby达不到我的要求时,我能够用Java执行“繁重的”任务。到目前为止(我还处于开发的早期阶段),这种混合方法一直运作良好。

我现在正处于需要为后台进程实施定期和长期运行任务的计划的地步。我的要求是拥有一个数据库支持的调度系统,理想情况下,该系统具有良好的文档记录,目前可以维护和清理。

我现在的问题是经过多天研究合适的自我宝石包装解决方案后,由于我使用了JRuby,我似乎只剩下很少的选择。

我试过的一些宝石......

rufus调度程序

在我对它的界面和文档感到满意之前使用了它,但是缺乏数据库持久性,因此对我的要求造成了破坏。

delayed_job的

我理想的解决方案是delayed_job。然而,由于ObjectSpace被关闭(但我们可以通过重新启用来解决这个问题),但仍然维护和数据库支持的良好文档在JRuby下中断了,但是更加致命的依赖于守护进程gem会导致“fork不安全并且禁用默认情况下,JRuby“由于JRuby实现中的限制而导致错误。

github上有一个没有依赖守护进程的分支,但是我很高兴切换到主开发分支的分支,我仍然留下了ObjectSpace问题我不确定对它的性能影响。

石英jruby的

虽然以前有过各种石英宝石,this very recent offering是另一种尝试提供光滑的红宝石般的界面。但是文档很少,我不确定这是否可以支持数据库,我的直觉是它不是。

问题

虽然我在这里只突出了3个选项,但我知道还有其他选项可用。然而,我无法找到解决方案来勾选所有3个需求框(文档,维护,数据库支持)。

所以问题是......

有没有其他人处于这种情况并提出解决方案?

有没有人设法让delayed_job以任何形式工作?

有没有更好的解决方案,我忽略了并满足了我的需求?

4 个答案:

答案 0 :(得分:4)

我们已经在JRuby下使用delayed_job(collectiveidea / v1.8.4)进行了一年多的生产。 我们没有启用ObjectSpace,也没有使用守护进程gem。

创建了一个简单的rake任务

  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 &

答案 1 :(得分: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 :(得分:2)

检查https://github.com/kares/jruby-rack-worker 这允许在jruby环境下使用delayed_job解决方案。 仍在进行中。 在撰写本文时,我的经验是,它可以与单个工作人员一起工作。 虽然我很难让额外的工人跑步。

答案 3 :(得分:1)

我最初在2010年12月问过这个问题,并且自那时起开发了一个我认为值得发回的解决方案供其他人参考。

正如其他人所指出的那样,有可能让像delayed_job这样的库与JRuby一起工作,对于某些人来说,这可能是一个可接受的解决方案。然而,我不想要一个需要运行额外进程的解决方案,考虑到这一点,我开发了一个利用Java的Executor框架并将其与ActiveRecord集成的gem。

结果是acts_as_executor,它允许Rails 3.x应用程序与执行程序和任务(将在适当的Java线程中运行)进行交互,就像任何其他ActiveRecord模型一样。

我最近移动了宝石以释放候选人1.看看GitHubRubygems

N.B。由于某种原因,RubyGems默认页面仍显示beta2。但是rc1仍然是最新版本。