JRuby on Rails:const_missing在启用config.threadsafe后显示

时间:2012-04-02 17:31:52

标签: ruby-on-rails ruby jruby

我看到在我的JRuby on Rails应用程序上禁用config.threadsafe!时不会发生异常蠕动。当我重新启动tomcat6时,这往往会升级,但它也可能在应用程序启动后发生。我发现了很多错误,如下所示:

uninitialized constant Foo::Check
org/jruby/RubyModule.java:2590:in `const_missing'

我的应用程序继续正常运行,可以毫无问题地处理请求。我只是好奇这些新发现的异常可能是什么原因?这是一个通用的已知问题吗?我是否需要为应用程序的不同区域提供更多代码,以确保此确切错误可以进一步诊断?

1 个答案:

答案 0 :(得分:1)

核心问题是require不是ruby中的线程安全活动。其中一个方面是类定义不是原子地发生的。

在foo.rb中考虑以下内容

class Foo
  BAR=1
  def bar
  end
end

线程1在您的应用中某处点击Foo::BAR,然后开始加载foo.rb.它到class Foo,创建了Foo类,但没有进一步。线程1然后被抢占,线程2也命中Foo::BAR。 Foo已经定义了,所以foo.rb没有再次加载,但是还没有定义BAR(当线程1完成它需要的时候),所以你得到一个const丢失错误。同样,此时创建的Foo对象在短时间内不会有bar方法。

显然,一个类越大,这个窗口就越大(为了让它更容易看到,你可以通过类定义在中途停留一个调用)

要解决此问题,rails会在应用程序启动时加载所有应用程序代码,但如果您在非标准位置拥有代码,则无法获得此处理。您可以通过config.eager_load_paths设置控制这样加载的内容。