我想知道除了杀死它的进程之外,我还能如何停止 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 是分布式 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