2012-04-02 36 views
1

当我的JRuby on Rails应用程序禁用config.threadsafe!时,我看到一个异常蔓延。当我重新启动tomcat6时,这种情况往往会恶化,但它也可能在应用程序启动后发生。我看到很多错误,如下所示:JRuby on Rails:const_missing自启用config.threadsafe后显示

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

我的应用程序继续正常工作,并且没有问题地处理请求。我只是好奇这些新发现的异常的原因是什么?这是一些通用的已知问题吗?我是否需要为应用程序的不同区域提供更多代码,以便确切的错误正在蔓延到进一步的诊断?

回答

1

核心问题是需求不是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方法。

显然,一类是更大的,更大该窗口(使它更容易被看到,你可以坚持一个呼叫通过类定义中途睡觉)

要解决这个问题,轨加载所有的应用程序代码在应用程序启动时,但如果您在非标准位置有代码,它将不会得到这种待遇。您可以通过config.eager_load_paths设置来控制像这样加载的内容。