0

我想知道除了杀死它的进程之外,我还能如何停止 Rinda 环服务器。

我检查了我的 ruby​​ 1.9.3 附带的 ring.rb,发现 RingServer 缺少 api 来停止自己。它在 initialize() 中打开一个 UDPSocket,但它不包含任何关闭该套接字的代码。

有人知道吗?提前谢谢。:D

4

1 回答 1

0

Rinda 是分布式 Ruby (DRb) 的一部分,因此如果目标只是停止所有 Rinda 和其他 DRb 服务,您可以这样做:

DRb.stop_service

如果您使用它,那么在您的 Rinda 服务代码(循环方法)中,您需要救援DRb::DRbConnError以避免尝试写入 TupleSpace 时出现问题,根据:http ://www.ruby-forum.com/topic/97023

不是 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

客户端.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 的实例保存在实例变量中,例如@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 上调用一两个方法来关闭、打开、绑定套接字。

要查看它如何使用 Ruby 1.9.3 中的套接字:https ://github.com/ruby/ruby/blob/v1_9_3_374/lib/rinda/ring.rb

于 2013-02-13T21:05:27.943 回答