library drb/gw

[edit]

要約

drb 通信を中継するゲートウェイ(DRb::GW)と、中継に必要なオブジェクト識別子変換クラス(DRb::GWIdConv)、および DRb::DRbObject への拡張が含まれています。

このライブラリを利用することで直接通信することが不可能であるような 2つのプロセスが中継プロセスを経て drb によりやりとりできるようになります。

drb による通信とは、オブジェクトをプロセス間でやりとりすること、およびそのメソッドを呼び出すことです。中継プロセスが保持している DRb::GW オブジェクトにそれ以外のプロセスがオブジェクトを登録したり、登録済みのオブジェクトを取り出すことでオブジェクトをやりとりします。そしてそのオブジェクトのメソッドを呼び出すことで中継プロセスを経由した通信ができます。

以下の URL も参照してください。

Example

この例は drb/gw.rb に含まれているものです。

foo.rb

require 'drb/drb'

class Foo
  include DRbUndumped
  def initialize(name, peer=nil)
    @name = name
    @peer = peer
  end

  def ping(obj)
    puts "#{@name}: ping: #{obj.inspect}"
    @peer.ping(self) if @peer
  end
end

gw_b.rb

require 'drb/drb'
require 'drb/gw'
require 'drb/unix'

DRb.install_id_conv(DRb::GWIdConv.new)

front = DRb::GW.new

s1 = DRb::DRbServer.new('drbunix:/tmp/gw_b_a', front)
s2 = DRb::DRbServer.new('drbunix:/tmp/gw_b_c', front)

s1.thread.join
s2.thread.join

gw_a.rb

require 'drb/unix'
require_relative 'foo'

obj = Foo.new('a')
DRb.start_service("drbunix:/tmp/gw_a", obj)

robj = DRbObject.new_with_uri('drbunix:/tmp/gw_b_a')
robj[:a] = obj

DRb.thread.join

gw_c.rb

require 'drb/unix'
require_relative 'foo'

foo = Foo.new('c', nil)

DRb.start_service("drbunix:/tmp/gw_c", nil)

robj = DRbObject.new_with_uri("drbunix:/tmp/gw_b_c")

puts "c->b"
a = robj[:a]
sleep 2

a.ping(foo)

DRb.thread.join

これを、gw_b, gw_a, gw_c の順に起動すると、gw_b を経由して gw_a と gw_c が通信します。

クラス

DRb::GW

drb 通信中継のためのゲートウェイです。

DRb::GWIdConv

DRb::DRbIdConv に drb 通信の中継に必要な拡張をしたもの。