Ruby on rails 如何在ruby中停止Rinda环服务器
我想知道除了杀死一个Rinda ring服务器的进程之外,我还可以如何停止它 我检查了ruby 1.9.3附带的ring.rb,发现RingServer缺少停止自身的api。它在initialize()中打开一个UDPSocket,但不包含任何关闭该套接字的代码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
有人知道吗?谢谢你DRinda是分布式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 patchRinda::RingServer
关闭套接字,因为听起来这正是您想要的。