I've got a class called Client that runs as a remote dRuby object. Client
has a 'run' method which will in turn invoke a 'run' method on the object
which is passed in - I want users to be able to define new classes which
Client doesn't know about which have run methods.
Here's part of Client.rb:
class Client
attr_writer :clientTimeLimit
def initialize
@clientTimeLimit=99999 #assume an 'infinite' timelimit
end
def run(task,*args)
result = ""
if( task.respond_to?(:run))
result = task.run(args)
else
puts "task type is: #{task.type}"
result = "COULD_NOT_RUN"
end
result
end
def remote_require(str)
puts "Client::remote_require(#{str})"
instance_eval str
#also tried class_eval str
#and just plain: eval str
#but none of these work!
end
end #class Client
if $0 == __FILE__
require 'drb'
clientObj = Client.new
DRb.start_service('druby://0.0.0.0:9000',clientObj)
puts "Client started"
DRb.thread.join
end
####end Client.rb
So I start Client.rb on a remote machine:
remote> ruby Client.rb
Now, on the local machine I've got a file called Task.rb that defines a
Task class and tries to send it to the Client object running on remote:
require 'drb'
class Task
#include DRb::DRbUndumped
def initialize
end
def run(*args)
puts "Task::Run - running #{args}"
end
end
if $0 == __FILE__
#require 'drb'
DRb.start_service()
client = DRbObject.new(nil,'druby://127.0.0.1:9000')
#read this file into a string and send it over:
requireString = ""
File.foreach($0) { |line|
requireString << line
}
client.remote_require(requireString)
puts client.run(Task.new, "ftp","xyz","abc")
end
#end Task.rb
So I'm trying to send a Task object to the remote client and of course the
remote client knows nothing of Task objects (unless I put a 'require
"Task.rb" at the top of Client.rb and ensure that Task.rb is available on
tghe remote machine - but I don't want to do that because users might
define different classes of their own) so I added that 'remote_require'
method to the Client class. I send the contents of Task.rb as a string to
the remote client's 'remote_require' method, but it doesn't work, I get:
COULD_NOT_RUN
printed on the local machine's stdout
and:
task type is: DRb::DRbUnknown
printed on the remote machine's stdout which means that the remote client
object knows nothing about the Task class. How can I change Client's
remote_require method to make this work?
Phil