我看到在我的JRuby on Rails应用程序上禁用config.threadsafe!
时不会发生异常蠕动。当我重新启动tomcat6时,这往往会升级,但它也可能在应用程序启动后发生。我发现了很多错误,如下所示:
uninitialized constant Foo::Check
org/jruby/RubyModule.java:2590:in `const_missing'
我的应用程序继续正常运行,可以毫无问题地处理请求。我只是好奇这些新发现的异常可能是什么原因?这是一个通用的已知问题吗?我是否需要为应用程序的不同区域提供更多代码,以确保此确切错误可以进一步诊断?
答案 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
设置控制这样加载的内容。