13

我正在使用 JRuby 1.5.6 on Rails 为自己构建一个应用程序,该应用程序将定期退出并检索我订阅的任何 RSS 播客。

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

我现在需要将定期和长时间运行的任务调度到后台进程。我的要求是拥有一个数据库支持的调度系统,理想情况下,该系统有据可查,目前维护良好且干净。

我现在的问题是,经过多日研究合适的自 gem 打包解决方案后,由于我使用了 JRuby,我似乎没有多少选择。

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

鲁弗斯调度程序

在我对它的界面和文档感到满意之前使用过它,但是缺乏数据库持久性,因此对我的要求来说是一个交易破坏者。

延迟作业

我理想的解决方案是delayed_job。良好的文档,仍然得到维护和数据库支持,然而,由于 ObjectSpace 被关闭(我们可以通过重新启用来解决这个问题),但更致命的是,对守护进程 gem 的依赖会引发“fork is unsafe and disabled”由于 JRuby 实现中的限制,默认情况下在 JRuby 上出现错误。

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

石英-jruby

虽然之前已经有各种基于石英的宝石,但最近的这个产品是提供类似红宝石的光滑界面的另一种尝试。然而,文档很少,我不确定这是否可以由数据库支持,我的直觉是它不是。

问题

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

所以问题是...

有没有其他人遇到过这种情况并提出解决方案?

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

有没有我忽略的更好的解决方案可以满足我的需求?

4

4 回答 4

4

I would recommend resque as the queueing system. Resque is similar to DelayedJob, but in my opinion much better. It was developed at GitHub and is used as their queueing system. I've also been using it in production for almost a year and I've been very happy with it.

Resque definitely has JRuby support, and all you have to do to get scheduled jobs is have a simple scheduler. Some recommend resque-scheduler, though I like to keep it simple and use clockwork which has a nice DSL for writing simple cron-like tasks to queue up schedulers (see: clockwork README). With that, you can just schedule things like so:

every(1.hour, 'tasks.alert') { Resque.push(:cron, :class => 'TaskAlert', :args => []) }
于 2011-02-12T16:52:04.517 回答
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 &
于 2011-02-10T01:31:41.250 回答
2

Check https://github.com/kares/jruby-rack-worker This allows delayed_job solution under jruby environment. Still work in progress. At the time of writing, my experience is that it works fine with a single worker. Though I have difficulties at making additional workers run.

于 2011-04-18T21:02:00.383 回答
1

我最初在 10 年 12 月提出了这个问题,并且后来开发了一个我认为值得发回供其他人参考的解决方案。

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

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

我最近将 gem 移至发布候选版本 1。看看GitHubRubygems

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

于 2011-09-09T11:11:41.370 回答