プロセスを強制終了する以外に、Rinda リング サーバーを停止する方法を知りたいです。
ruby 1.9.3 に同梱されている ring.rb を確認したところ、RingServer にはそれ自体を停止するための API がないことがわかりました。initialize() で UDPSocket を開きますが、そのソケットを閉じるコードは含まれていません。
誰もそれを知っていますか?先に感謝します。:D
プロセスを強制終了する以外に、Rinda リング サーバーを停止する方法を知りたいです。
ruby 1.9.3 に同梱されている ring.rb を確認したところ、RingServer にはそれ自体を停止するための API がないことがわかりました。initialize() で UDPSocket を開きますが、そのソケットを閉じるコードは含まれていません。
誰もそれを知っていますか?先に感謝します。:D
Rinda は Distributed Ruby (DRb) の一部であるため、目的が Rinda と他の DRb サービスをすべて停止することだけである場合は、次のようにすることができます。
DRb.stop_service
それを使用する場合は、Rinda サービス コード (ループ メソッド) でDRb::DRbConnError
、TupleSpace に書き込もうとする問題を回避するためにレスキューする必要があります。
Rinda サービスではありませんが、DRb サービスを停止するテストを行った簡単な例を次に示します。Ruby 1.9.3 で DRb (Rinda なし) を使用するだけで、次の例から少し変更されています: http://www.ruby-doc.org/stdlib-1.9.3/libdoc/drb/rdoc/DRb.html
サーバー.rb
#!/usr/local/bin/ruby
require 'drb/drb'
URI="druby://localhost:8787"
class StopAndGiveTimeServer
def get_current_time
DRb.stop_service
return Time.now
end
end
FRONT_OBJECT=StopAndGiveTimeServer.new
$SAFE = 1 # disable eval() and friends
DRb.start_service(URI, FRONT_OBJECT)
DRb.thread.join
client.rb
#!/usr/local/bin/ruby
require 'drb/drb'
SERVER_URI="druby://localhost:8787"
DRb.start_service
timeserver = DRbObject.new_with_uri(SERVER_URI)
puts timeserver.get_current_time
更新:リングサーバーにモンキーパッチを適用してソケットを閉じたいようです。
モンキーパッチを介して既存のソケットを取得する方法を作成するだけです:
module Rinda
class RingServer
attr_accessor :soc
end
end
次に、リングサーバーのインスタンスをインスタンス変数に保持し、@ringserver
それを使用してソケットにアクセスして閉じたり、新しいソケットを設定したりできます。
def bind_to_different_port(port)
begin
@ringserver.soc.close
rescue => e
puts "#{e.message}\n\t#{e.backtrace.join("\n\t")}"
end
@ringserver.soc=UDPSocket.open
@ringserver.soc.bind('', port)
end
または、attr_accessor をスキップして RingServer にメソッドを追加し、RingServer で 1 つまたは 2 つのメソッドを呼び出して、ソケットを閉じたり、開いたり、バインドしたりします。
Ruby 1.9.3 でソケットを使用する方法を確認するには: https://github.com/ruby/ruby/blob/v1_9_3_374/lib/rinda/ring.rb