2010-12-08 68 views
13

我在Rails上使用JRuby 1.5.6来构建自己的应用程序,它将定期离开并检索我订阅的任何RSS Podcast。jruby on rails调度选项

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

我现在正处于需要将定期和长时间运行任务安排到后台进程的时间点。我的要求是拥有一个数据库支持的调度系统,理想情况下,这些系统是有据可查的,目前维护和清洁。

我现在的问题是,经过多天的研究,找到适合自己封装的解决方案,我似乎留下了很少的选择,因为我使用了JRuby。

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

鲁弗斯调度

曾使用此之前,我很高兴与它的界面和文档,但还缺乏数据库持久性的,因此成为我的要求的破产者。

delayed_job的

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

在github上有一个不依赖于守护进程的fork,但是我不开心切换到主开发分支的一个fork,我仍然留下ObjectSpace问题,我不确定至于它的性能影响。

石英jruby的

虽然已经有各种石英基于宝石之前,this very recent offering是提供一种光滑的红宝石状接口的另一尝试。然而,有很少的文档,我不确定如果这可以数据库支持,我的直觉是它不是。

问题

虽然我只强调3个选项在这里,我知道有其他人可用。然而,我却找不到解决方案来打勾所有3个需求框(文档,维护,数据库支持)。

所以这个问题......

任何人都有过这种情况,并提出了一个解决方案?

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

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

+1

**更新**我认为值得发布我决定使用JRuby的最终解决方案,现在在1.7.2。我目前的设置使用Sidekiq和发条。它已被证明是一个可靠的长期解决方案 – 2013-01-22 01:06:29

回答

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

我认为这与运行类似,您可以在[..]/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

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

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

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

我最近把宝石移到了候选版本1上。看看GitHubRubygems

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