0

プロセスを強制終了する以外に、Rinda リング サーバーを停止する方法を知りたいです。

ruby 1.9.3 に同梱されている ring.rb を確認したところ、RingServer にはそれ自体を停止するための API がないことがわかりました。initialize() で UDPSocket を開きますが、そのソケットを閉じるコードは含まれていません。

誰もそれを知っていますか?先に感謝します。:D

4

1 に答える 1

0

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

于 2013-02-13T21:05:27.943 に答える