在开发RoR应用程序后,我需要了解有关JRuby on Rails的信息?

时间:2010-08-30 09:24:16

标签: ruby-on-rails ruby google-app-engine jruby jrubyonrails

我使用Ruby on Rails完成了一些项目。我将在Rails上使用JRuby并在GAE上托管它。在那种情况下,在开发JRuby应用程序时我需要知道的是什么。我读了那个

  • JRuby具有相同的语法
  • 我可以访问Java库
  • JRuby无法访问某些宝石/插件
  • JRuby应用程序首次加载需要一些时间,所以我必须通过发送保持活着 请求每5分钟左右
  • 我不能使用ActiveRecord,而是我必须使用DataMapper

如果我对我所做的任何陈述有误,请更正。还有其他我必须知道的事吗?我是否需要从头开始阅读有关JRuby的内容,或者我可以像往常一样开发Ruby应用程序?

3 个答案:

答案 0 :(得分:3)

我每天都使用JRuby。

<强>真

  • JRuby具有相同的语法
  • JRuby无法访问某些宝石/插件
  • 我可以访问Java库

有些宝石/插件有特定于jruby的版本,有些根本不起作用。总的来说,我发现很少有问题,随着库和平台的成熟,很多问题都消失了(JRuby已经变得更好了)。

您可以访问Java,但一般来说为什么要这样?

<强>题:

  • JRuby应用程序首次加载需要一些时间,所以我必须每5分钟发送一次请求保持活着
  • 我不能使用ActiveRecord,而是我必须使用DataMapper

虽然我想可以想象一下服务器设置,其中JVM的初始启动/预热成本意味着您需要ping服务器,但JRuby中没有任何固有的东西可以实现这一点。如果需要使服务器保持活动状态,则应该查看部署环境。在与乘客共享托管中发生类似情况,其中应用程序在一段时间不活动后可能会内存不足。

另外,我们使用ActiveRecord完全没有问题。

答案 1 :(得分:1)

afaik,rails 3与jruby 100%兼容,因此在该路径上应该没有问题。

像每个新平台一样,你应该通过玩jruby让自己感觉舒服。我建议使用RVM来做到这一点。

就你的问题而言:

  • JRuby只是像MRI或Rubinus这样的其他运行时
  • 因为JRuby在JVM中使用Java非常容易,但你也可以使用来自MRI的RJB
  • 某些gems不兼容,当他们使用本地c库时,不能在JRuby上运行
  • JVM和您的应用程序容器需​​要启动时间和一些时间来加载您的应用程序,但就是这样,没有必要保持活着,这是错误的
  • 你可以使用你想要的任何东西,大多数宝石都被更新为与JRuby兼容

答案 2 :(得分:0)

@TobyHede主要涵盖了您认为可能存在的问题,因此我会将其留在那里。

至于其他要考虑的事情,它只是一个不同的翻译,并且会出现有趣的差异,需要进行一些调整。

  1. 某些方法的实现方式不同,例如sleep 10.seconds将抛出异常(你必须sleep 10.seconds.to_i)并且我记得在从MRI切换到JRuby时在Symbol类上获取NoMethodError(不记得哪种方法)没有实现),只是要记住会有轻微的变化
  2. 您将体验到宝石中的挂起和异常,否则这些宝石会为您工作(例如,在列出多个页面时撬开)
  3. 某些宝石可能会有不同的工作方式,如果你按ctrl + c,撬(再次)会退出,非常讨厌
  4. 所有东西的加载时间稍慢,没有宙斯
  5. 你会偶尔得到java异常堆栈跟踪,但没有指出它发生了哪一行ruby代码
  6. Timeout.timeout经常无法按预期工作,因为它的网络代码和星星很好地排列在一起(这大部分是在jruby核心中修复的,但似乎仍然存在一个问题,即宝石在自己的网络代码中运行纯java)
  7. 第三方代码How do you choose gems for a high throughput multithreaded Rails app?中线程安全的隐藏问题 - 例如,远离EventMachine
  8. 线程会很棒(由于原生性而且没有gil)并且纤维会吮吸(由于JVM中没有协同支持它们是普通的线程),这就是为什么在比较时你通常不会通过赛璐珞获得性能提升到MRI
  9. 你曾经使用MRI Ruby作为操作系统中的进程来运行你的轨道,你知道如何跟踪它们的PID,膨胀,运行时间,杀死它们,监视它们等等,当你切换到JRuby因为一切都不明显已经在一个过程中转向线程。 Java世界有很好的工具来处理这些问题,但是你需要学习它
  10. 当你的控制台挂起时,
  11. killall -9 ruby没有使用jruby的技巧(之前更频繁地执行),你必须ps -ef然后跟踪正确的进程而不会杀死你的netbeans等(轻微的,但令人讨厌的)
  12. 由于我的最后一点,知道Java和JVM会帮助你在某些情况下摆脱困境(取决于你打算做什么,这可能是你真正需要的),选择部署服务器会增加或减少这种需求(例如,对于这种情况,有点臭名昭着,其他部署选项可能更简单,请参阅http://thenerdings.blogspot.com/2012/09/pulling-plug-on-torquebox-and-jruby-for.html
  13. ...
  14. 另外,请参阅jruby团队关于差异的内容,https://github.com/jruby/jruby/wiki/DifferencesBetweenMriAndJruby

    但是,是的,否则它“就像MRI Ruby一样”:)