1

我已经使用 Ruby on Rails 完成了一些项目。我将使用 JRuby on Rails 并将其托管在 GAE 上。在那种情况下,我在开发 JRuby 应用程序时需要了解哪些内容。我读到了

  • JRuby 具有相同的语法
  • 我可以访问 Java 库
  • JRuby 无法访问某些 gems/plugins
  • JRuby 应用程序第一次加载需要一些时间,所以我必须通过每 5 分钟左右发送一次请求来保持它处于活动状态
  • 我不能使用 ActiveRecord,而是必须使用 DataMapper

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

4

3 回答 3

3

我每天都使用 JRuby。

真的:

  • JRuby 具有相同的语法
  • JRuby 无法访问某些 gems/plugins
  • 我可以访问 Java 库

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

您可以访问 Java,但通常为什么要访问?

错误的:

  • JRuby 应用程序第一次加载需要一些时间,所以我必须通过每 5 分钟左右发送一次请求来保持它处于活动状态
  • 我不能使用 ActiveRecord,而是必须使用 DataMapper

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

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

于 2010-08-30T09:47:05.787 回答
1

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

像每个新平台一样,您应该通过玩弄 jruby 来让自己适应它。我建议使用 RVM 来做到这一点。

至于你的问题:

  • JRuby 只是像 MRI 或 Rubinus 一样的其他运行时
  • 由于 JRuby 在 JVM 中使用 Java 非常容易,但您也可以使用 MRI 中的 RJB
  • 有些 gem 不兼容,当它们使用本机 c 库时,它们不在 JRuby 上运行
  • JVM 和您的应用程序容器需​​要启动时间和一些时间来加载您的应用程序,但仅此而已,不需要保持活动状态,这是错误的
  • 你可以使用任何你想要的东西,大多数 gem 都更新为与 JRuby 兼容
于 2010-08-30T10:03:48.320 回答
0

@TobyHede 主要涵盖了您认为自己可能遇到的问题,所以我将把它留在那里。

至于其他要记住的事情,这只是一个不同的解释器,并且会出现有趣的差异,这需要一些适应。

  1. 一些方法的实现方式不同,例如sleep 10.seconds会抛出异常(你必须这样做sleep 10.seconds.to_i),我记得从 MRI 切换到 JRuby 时在 Symbol 类上出现 NoMethodError(不记得哪个方法没有实现),只要记住细微的变化会在那里
  2. 您将在宝石中遇到原本对您有用的挂起和异常(例如,在列出超过一页时撬开)
  3. 有些宝石的工作方式可能不同,例如,如果您按ctrl+ ,pry(再次)将退出,非常烦人c
  4. 一切的加载时间稍慢,没有宙斯
  5. 你会偶尔得到 java 异常堆栈跟踪,但没有指示它发生在哪一行 ruby​​ 代码
  6. Timeout.timeout当它缠绕在网络代码和星星排列不良时,通常不会按预期工作(这主要在 jruby 核心中得到修复,但它似乎仍然是在纯 java 中执行自己的网络代码的 gem 的问题)
  7. 第三方代码中线程安全的隐藏问题如何为高吞吐量多线程 Rails 应用程序选择 gem?- 例如,远离 EventMachine
  8. 线程会很棒(由于本地性和没有 gil)并且纤维会很糟糕(由于 JVM 中没有协程支持,它们是普通线程),这就是为什么与 MRI 相比,赛璐珞通常不会获得性能提升
  9. 您曾经使用 MRI Ruby 作为操作系统中的进程运行 Rails,您知道如何跟踪它们的 PID、膨胀、运行时间、杀死它们、监视它们等,当您切换到 JRuby 时,这部分并不明显,因为一切都转向了单个进程中的线程。Java 世界有很好的工具来处理这些问题,但它是你必须学习的东西
  10. killall -9 ruby当您的控制台挂起时(它比以前更频繁地这样做),jruby 并没有做到这一点,您必须ps -ef跟踪正确的进程而不杀死您的 netbeans 等(次要,但很烦人)
  11. 由于我的最后一点,了解 Java 和 JVM 将帮助您在某些情况下摆脱困境(取决于您打算做什么,这可能是您真正需要的东西),部署服务器的选择将增加或减少这种需求(例如,扭矩箱有点臭名昭著,其他部署选项可能更简单,请参阅http://thenerdings.blogspot.com/2012/09/pulling-plug-on-torquebox-and-jruby-for.html
  12. ...

另外,看看 jruby 团队对差异的看法,https://github.com/jruby/jruby/wiki/DifferencesBetweenMriAndJruby

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

于 2014-01-04T09:47:22.337 回答