Ruby on rails 如何在ruby中停止Rinda环服务器

Ruby on rails 如何在ruby中停止Rinda环服务器,ruby-on-rails,ruby,druby,Ruby On Rails,Ruby,Druby,我想知道除了杀死一个Rinda ring服务器的进程之外,我还可以如何停止它 我检查了ruby 1.9.3附带的ring.rb,发现RingServer缺少停止自身的api。它在initialize()中打开一个UDPSocket,但不包含任何关闭该套接字的代码 有人知道吗?谢谢你DRinda是分布式Ruby(DRb)的一部分,因此如果目标是停止所有Rinda和其他DRb服务,您可以: DRb.stop_service 如果您使用该方法,那么在Rinda服务代码(循环方法)中,您需要援救DRb

我想知道除了杀死一个Rinda ring服务器的进程之外,我还可以如何停止它

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


有人知道吗?谢谢你D

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

DRb.stop_service
如果您使用该方法,那么在Rinda服务代码(循环方法)中,您需要援救
DRb::DRbConnError
,以避免尝试写入TupleSpace时出现问题,根据:

不是Rinda服务,但下面是我测试的一个简单示例,它停止了DRb服务。它只是在Ruby 1.9.3中使用了DRb(无Rinda),在这里的示例中稍作修改:

server.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
#!/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
客户端.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
#!/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
更新:听起来你想用猴子补丁环服务器来关闭套接字

只需创建一种通过monkey patch获取现有套接字的方法:

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_访问器,只需向RingServer添加一个方法并调用RingServer上的一两个方法即可关闭、打开和绑定套接字


要了解它如何使用Ruby 1.9.3中的套接字:

您是否在本地主机中运行?Windows还是Linux或UNIX?我在Ubuntu下运行,RINDA服务器和它的客户端都在同一台机器上运行。我试过这个,但是它不工作。考虑这里的代码:Drb. StasyService RINDA::RingServer.new Rinda:tupESPACK.NeXDRB.STECUSTORE睡眠(100000),然后您可以运行另一个脚本试图绑定到端口7647,你会失败的。Rinda只使用DRb来操纵元组空间。它侦听用于服务器自动发现的端口7647,我不能告诉Rinda关闭该端口,除非我杀死其进程而不是休眠,加入到DRb线程,这样当DRb停止时,环服务器停止,例如,
要求“Rinda/ring”;需要“rinda/tuplespace”;DRb.start_服务;Rinda::RingServer.new(Rinda::TupleSpace.new);DRb.thread.join
。我将更新答案,以建议如何使用monkey patch
Rinda::RingServer
关闭套接字,因为听起来这正是您想要的。