要約
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 で作られたサービスを管理するクラスです。 |