2011-06-21 28 views
2

我有一個簡單的DataMapper/Sinatra應用程序作爲搜索服務在JRuby上運行。我在搜索時收到零星的錯誤消息(找不到特別的韻律或原因),想知道是否有其他人遇到過類似的問題。在JRuby中使用Solr和太陽黑子的低級錯誤

這些錯誤是隨機發生的,本身就是不一致的。

例子:

INFO: IOError - closed stream: 
org/jruby/RubyIO.java:2616:in `sysread' 
/usr/lib/jruby/lib/ruby/1.8/net/protocol.rb:135:in `rbuf_fill' 
org/jruby/ext/Timeout.java:99:in `timeout' 
/usr/lib/jruby/lib/ruby/1.8/net/protocol.rb:134:in `rbuf_fill' 
/usr/lib/jruby/lib/ruby/1.8/net/protocol.rb:116:in `readuntil' 
/usr/lib/jruby/lib/ruby/1.8/net/protocol.rb:126:in `readline' 
/usr/lib/jruby/lib/ruby/1.8/net/http.rb:2026:in `read_status_line' 
/usr/lib/jruby/lib/ruby/1.8/net/http.rb:2015:in `read_new' 
/usr/lib/jruby/lib/ruby/1.8/net/http.rb:1051:in `request' 
/usr/lib/jruby/lib/ruby/1.8/net/http.rb:1037:in `request' 
/usr/lib/jruby/lib/ruby/1.8/net/http.rb:543:in `start' 
/usr/lib/jruby/lib/ruby/1.8/net/http.rb:1035:in `request' 
/usr/lib/jruby/lib/ruby/1.8/net/http.rb:772:in `get' 
/usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/rsolr-0.12.1/lib/rsolr/connection/net_http.rb:16:in `get' 
/usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/rsolr-0.12.1/lib/rsolr/connection/requestable.rb:36:in `request' 
/usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/rsolr-0.12.1/lib/rsolr/client.rb:34:in `request' 
/usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/sunspot-1.2.1/lib/sunspot/search/abstract_search.rb:35:in `execute' 
/usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/sunspot-1.2.1/lib/sunspot/session.rb:59:in `search' 
/usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/sunspot-1.2.1/lib/sunspot.rb:335:in `search' 
/var/www/search/application.rb:7:in `HEAD /search' 

INFO: NoMethodError - undefined method `+' for nil:NilClass: 
/usr/lib/jruby/lib/ruby/1.8/net/protocol.rb:178:in `write0' 
/usr/lib/jruby/lib/ruby/1.8/net/protocol.rb:153:in `write' 
/usr/lib/jruby/lib/ruby/1.8/net/protocol.rb:168:in `writing' 
/usr/lib/jruby/lib/ruby/1.8/net/protocol.rb:152:in `write' 
/usr/lib/jruby/lib/ruby/1.8/net/http.rb:1580:in `write_header' 
/usr/lib/jruby/lib/ruby/1.8/net/http.rb:1535:in `exec' 
/usr/lib/jruby/lib/ruby/1.8/net/http.rb:1049:in `request' 
/usr/lib/jruby/lib/ruby/1.8/net/http.rb:772:in `get' 
/usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/rsolr-0.12.1/lib/rsolr/connection/net_http.rb:16:in `get' 
/usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/rsolr-0.12.1/lib/rsolr/connection/requestable.rb:36:in `request' 
/usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/rsolr-0.12.1/lib/rsolr/client.rb:34:in `request' 
/usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/sunspot-1.2.1/lib/sunspot/search/abstract_search.rb:35:in `execute' 
/usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/sunspot-1.2.1/lib/sunspot/session.rb:59:in `search' 
/usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/sunspot-1.2.1/lib/sunspot.rb:335:in `search' 
/var/www/search/application.rb:7:in `HEAD /search' 

INFO: IOError - stream closed: 
org/jruby/RubyIO.java:1978:in `close' 
/usr/lib/jruby/lib/ruby/1.8/net/protocol.rb:70:in `close' 
/usr/lib/jruby/lib/ruby/1.8/net/http.rb:1059:in `request' 
/usr/lib/jruby/lib/ruby/1.8/net/http.rb:772:in `get' 
/usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/rsolr-0.12.1/lib/rsolr/connection/net_http.rb:16:in `get' 
/usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/rsolr-0.12.1/lib/rsolr/connection/requestable.rb:36:in `request' 
/usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/rsolr-0.12.1/lib/rsolr/client.rb:34:in `request' 
/usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/sunspot-1.2.1/lib/sunspot/search/abstract_search.rb:35:in `execute' 
/usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/sunspot-1.2.1/lib/sunspot/session.rb:59:in `search' 
/usr/lib/jruby-1.6.0/lib/ruby/gems/1.8/gems/sunspot-1.2.1/lib/sunspot.rb:335:in `search' 
/var/www/search/application.rb:7:in `HEAD /search' 

的錯誤似乎與太陽黑子的東西下面的問題(RSolr或JRuby的可能?),但我在一個小的損失,因爲我無法找到一致地重現問題的一種方法。我試過用Solr來安裝Solr來查看它是否是Solr/Tomcat的問題,但我還沒有抓到Solr/Tomcat放棄這個球。

回答

2

問題在於線程。默認情況下,太陽黑子的會話對象不是線程安全的。在Sunspot :: Rails中,它默認使用線程安全對象,但由於這是Sinatra,因此您必須手動執行此操作,如下所示:

Sunspot.session = Sunspot::SessionProxy::ThreadLocalSessionProxy.new(Sunspot.config)