From: koicat on
The following code works fine as long as I don't try to run it through
the distributed server. It doesn't get there...
It runs fine out of delayed_job, runs fine if called directly.
But if 'distrib' is true (the default) it runs right up to the call to
the server and right past it without getting to the server or raising
any errors.

Am using Ruby 1.8.6.26 , Ringy-Dingy 1.2.1, dj 1.8.4.

*********The server:
require 'rinda/ring'
class ScriptServer
include DRbUndumped
attr_accessor :result
def run(fullScript)
myTS = Time.now.strftime("%Y%m%d%H%M%S")
msg = "===> Starting #{scriptname} in run #{scriptrun} on
#{scriptenv} at #{myTS}"
puts msg
@result = "***#{scriptname} Launched [#{scriptlaunch}]"
rslt = fullScript.run
@result << rslt
msg = "#{scriptname} Completed [#{Time.now.strftime("%Y%m%d%H%M
%S")}]"
@result << "***#{msg}"
rescue
@result << "#{scriptname} Aborted [#{Time.now.strftime("%Y%m%d%H%M
%S")}] \n #{$!} \n #{caller.to_yaml}"
ensure
return @result
end
end
DRb.start_service
myPid = Process.pid.to_s
puts myPid
ring_server = Rinda::RingFinger.primary
ring_server.write([:name,
:ScriptServer,
ScriptServer.new(),
"ScriptServer #{myPid}"],
Rinda::SimpleRenewer.new)
DRb.thread.join

******** The worker/client
require 'active_support'
require 'drb'

class ScriptWorker

attr_accessor :script_id
attr_accessor :run_id
attr_accessor :distrib

def initialize( script_id, run_id, distrib = true )
self.script_id = script_id
self.run_id = run_id
self.distrib = distrib
@myLog = ''
end

def perform
myScript = Script.find(script_id)
# left out setting of variables used below...

require "#{myRoot}/script/#{myScript.name}"

fullScript = Object.const_get(myClass).new( myScript, myRun,
runenv, myURI, myRoot )

if self.distrib
require 'rinda/ring'
DRb.start_service
ring_server = Rinda::RingFinger.primary
service = ring_server.take([:name, :ScriptServer, nil, nil])
server = service[2]
result = server.run(fullScript)
puts result
else
result = fullScript.run
puts result
end
@myLog.close
end

def init_my_log( name )
....
end
end

******** The parent script class
require 'rubygems'
require 'util1'
require 'drb'

class ScriptMain

currDir = Dir.pwd

include Util1
include DRbUndumped

def initialize( aScript, aRun, runenv, myURI, myRoot )
@myScript = aScript
@myId = @myScript.id
@myName = File.basename(@myScript.name, "*.rb")
@usecase = @myName
@myRun = aRun
@myRoot = myRoot
@rootDir = "#{RAILS_ROOT}"
@launch = aRun.launched
@runenv = runenv
@myURI = myURI
@runid = aRun.id
@optionStrg = aRun.options
@myBrowser = ''
@myHwnd = 0

end
end

**********a sample child script class
(Just the run method. bunch of other methods in full script)

class SearchTest < ScriptMain

def run( limit = 5.minutes )
begin
puts '&*&*&* I am here *&*&*&'
@runenv = 'WEB'
open_log(@myName, @rootDir, @myRoot, @launch, @start,
@myId, @runenv, @usecase, @runid, @optionStrg )

mark_testlevel('Test Parent', 7) # Module
mark_testlevel('Test Child', 6) # SubModule

@myBrowser = Watir::IE.new_process
@myHwnd = @myBrowser.hwnd
lookup('Google')
emaillogin(@myBrowser, @service, @username, @password)
logout(@myBrowser)

rescue
log_message(FATAL, "(#{__LINE__}) #{$!}", @@fail)
raise
ensure
create_flag_file(Time.new.to_f.to_s, 'parse' ) unless @runid ==
'99999'
close_log(@myName, __LINE__)
end
end #def


end