要約
DRb::ExtServManager を定義しているライブラリ。
DRb::ExtServManager は drb で実現されたサービスブローカーです。個々のサービスは drb/extserv で定義されている DRb::ExtServ を用いて実装します。 DRb::ExtServManager はクライアントの要求に応じて個々のサービスをサブプロセスとして起動し、各サービスを表す DRb::ExtServ オブジェクトをリモートオブジェクトとしてクライアントに渡します。
このライブラリは簡易的なもので、あまりメンテナンスもされていないので、本格的な用途にはこのライブラリを参考にして実装してください。
Example
以下の例を実行するためには、まず server.rb を起動し、その後 client.rb を動かします。service.rb は server.rb が client.rb からサービスを要求された時に起動されます。また、stop.rbを用いて
server.rb:
require 'drb/drb' require 'drb/extservm' Dir.chdir(File.dirname(__FILE__)) # サービスを起動するコマンドを指定する # コマンドは文字列配列、もしくは文字列で指定できる # サブプロセスの起動は Kernel.#spawn でなされる # # サブプロセスを起動するときは、ここに指定したパラメータに加えて # さらに2つのパラメータ(サーバの druby URI とサービス名)が渡されます DRb::ExtServManager.command["No1"] = %w(ruby service.rb service1) DRb::ExtServManager.command["No2"] = %w(ruby service.rb service2) # ExtServManager オブジェクトを生成して # drb の front object に指定する s = DRb::ExtServManager.new DRb.start_service("druby://localhost:10234", s) # drb のプロセスの終了を待つ DRb.thread.join
service.rb:
require 'drb/drb' require 'drb/extserv' # サービスを表すクラス class Service include DRb::DRbUndumped def initialize(service_name) @service_name = service_name end def hello "You invoke #{@service_name}" end end puts "Start #{ARGV[0]}" # ARGV の最後2つを除いた部分は ExtServManager.command で # 指定した引数が渡される front = Service.new(ARGV[0]) # 通信のため drb を起動する # ポート番号に 0 を指定すると ephemeral port から適当なポート番号が # 選ばれる server = DRb::DRbServer.new("druby://localhost:0", front) # ARGV の最後の2つと DRbServer オブジェクトを ExtServ.new に渡す。 # これによってブローカープロセスにサービスの # 窓口となる ExtServ オブジェクトを渡す es = DRb::ExtServ.new(ARGV[1], ARGV[2], server) # サーバスレッドの停止を待つ DRb.thread.join # サービスを DRb::ExtServ#stop_service で止めると、サーバスレッドが # 終了するため、以下の行が実行される puts "Stop #{ARGV[0]}"
client.rb:
require 'drb/drb' DRb.start_service s = DRbObject.new_with_uri("druby://localhost:10234") # No1 と名付けられたサービスを呼び出す service1 = s.service("No1").front p service1.hello # => "service1" # No2 と名付けられたサービスを呼び出す service2 = s.service("No2").front p service2.hello # => "service2"
stop.rb:
require 'drb/drb' DRb.start_service s = DRbObject.new_with_uri("druby://localhost:10234") s.service(ARGV[0]).stop_service
クラス
DRb::ExtServManager | DRb::ExtServ で作られたサービスを管理するクラスです。 |