私はこのテストコードを持っています:
require 'drb/drb'
DRb.start_service(nil, "hello")
puts DRb.uri
DRb.thread.join()
次に、nmap などを使用して取得したポートをプローブすると、数回プローブした後、アプリがクラッシュします。
JRuby 1.7 では、次のスタックを取得します。
Errno::ENOPROTOOPT: Protocol not available - Protocol not available
setsockopt at org/jruby/ext/socket/RubyBasicSocket.java:294
set_sockopt at /Users/kimptoc/.rvm/rubies/jruby-1.7.3/lib/ruby/1.9/drb/drb.rb:1005
initialize at /Users/kimptoc/.rvm/rubies/jruby-1.7.3/lib/ruby/1.9/drb/drb.rb:927
accept at /Users/kimptoc/.rvm/rubies/jruby-1.7.3/lib/ruby/1.9/drb/drb.rb:991
main_loop at /Users/kimptoc/.rvm/rubies/jruby-1.7.3/lib/ruby/1.9/drb/drb.rb:1615
run at /Users/kimptoc/.rvm/rubies/jruby-1.7.3/lib/ruby/1.9/drb/drb.rb:1465
Ruby 1.9.3-392 では、スタックは次のとおりです。
/Users/kimptoc/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/drb/drb.rb:964:in `setsockopt': Invalid argument (Errno::EINVAL)
from /Users/kimptoc/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/drb/drb.rb:964:in `set_sockopt'
from /Users/kimptoc/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/drb/drb.rb:886:in `initialize'
from /Users/kimptoc/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/drb/drb.rb:950:in `new'
from /Users/kimptoc/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/drb/drb.rb:950:in `accept'
from /Users/kimptoc/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/drb/drb.rb:1574:in `main_loop'
from /Users/kimptoc/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/drb/drb.rb:1424:in `block in run'
これらの状況でクラッシュしないように、dRuby をより堅牢にする方法 (たとえば、どこかのオプションまたは構成設定) はありますか?
アップデート
このようにコードをループに入れることで、回復力が向上するように見えますが、これが最善の方法です。
while true
begin
DRb.start_service("druby://localhost:12345", "hello")
puts DRb.uri
DRb.thread.join()
rescue Exception => e
puts e.message
end
end
ティア