Programming Tutorials

(追記) (追記ここまで)

Using remote objects under dRuby

By: Jeya in Ruby Tutorials on 2009年03月03日 [フレーム]

This example illustrates returning a reference to an object from a dRuby call. The Logger instances live in the server process. References to them are returned to the client process, where methods can be invoked upon them. These methods are executed in the server process.

Server code

 require 'drb/drb'
 URI="druby://localhost:8787"
 class Logger
 # Make dRuby send Logger instances as dRuby references,
 # not copies.
 include DRb::DRbUndumped
 def initialize(n, fname)
 @name = n
 @filename = fname
 end
 def log(message)
 File.open(@filename, "a") do |f|
 f.puts("#{Time.now}: #{@name}: #{message}")
 end
 end
 end
 # We have a central object for creating and retrieving loggers.
 # This retains a local reference to all loggers created. This
 # is so an existing logger can be looked up by name, but also
 # to prevent loggers from being garbage collected. A dRuby
 # reference to an object is not sufficient to prevent it being
 # garbage collected!
 class LoggerFactory
 def initialize(bdir)
 @basedir = bdir
 @loggers = {}
 end
 def get_logger(name)
 if [email protected]_key? name
 # make the filename safe, then declare it to be so
 fname = name.gsub(/[.\/]/, "_").untaint
 @loggers[name] = Logger.new(name, @basedir + "/" + fname)
 end
 return @loggers[name]
 end
 end
 FRONT_OBJECT=LoggerFactory.new("/tmp/dlog")
 $SAFE = 1 # disable eval() and friends
 DRb.start_service(URI, FRONT_OBJECT)
 DRb.thread.join

Client code

 require 'drb/drb'
 SERVER_URI="druby://localhost:8787"
 DRb.start_service
 log_service=DRbObject.new_with_uri(SERVER_URI)
 ["loga", "logb", "logc"].each do |logname|
 logger=log_service.get_logger(logname)
 logger.log("Hello, world!")
 logger.log("Goodbye, world!")
 logger.log("=== EOT ===")
 end



(追記) (追記ここまで)


Add Comment

JavaScript must be enabled for certain features to work
* Required information
1000

Comments

No comments yet. Be the first!
(追記) (追記ここまで)
(追記) (追記ここまで)

AltStyle によって変換されたページ (->オリジナル) /