Hi, I am trying to get a worker instance to delete itself at the end of its do_work method. I have my main rails app creating these workers upon certain incoming http requests to parse some XML files, and once the parsing is complete, I would like the worker to delete itself, so that I don''t need to try and manage several workers within the main rails app. I was trying to accomplish this with the following line: ::BackgrounDRb::MiddleMan.instance.delete_worker @_job_key. However, when I tried this, I get the following errer: 20070405-13:15:15 (19653) In do work 20070405-13:15:18 (19653) You have a nil object when you didn''t expect it! The error occured while evaluating nil.shutdown - (NoMethodError) It seems that perhaps this method of trying to access the job key of the current instance is not working. Has anybody else done something similar, or have any suggestions for a different method to accomplish this? Thanks, Simon --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
On a similar note, is there any way to monitor the number of worker instances that are running? What I am after is to ensure that worker instances are being deleted, and so I would like to be able to keep an eye on when new instances are created, and when they are deleted. Thanks again, Simon On Apr 10, 9:42 am, "Simon" <simon.wilkin...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> Hi, > > I am trying to get a worker instance to delete itself at the end of > its do_work method. I have my main rails app creating these workers > upon certain incoming http requests to parse some XML files, and once > the parsing is complete, I would like the worker to delete itself, so > that I don''t need to try and manage several workers within the main > rails app. > > I was trying to accomplish this with the following > line: ::BackgrounDRb::MiddleMan.instance.delete_worker @_job_key. > However, when I tried this, I get the following errer: > > 20070405-13:15:15 (19653) In do work > 20070405-13:15:18 (19653) You have a nil object when you didn''t expect > it! > The error occured while evaluating nil.shutdown - (NoMethodError) > > It seems that perhaps this method of trying to access the job key of > the current instance is not working. Has anybody else done something > similar, or have any suggestions for a different method to accomplish > this? > > Thanks, > > Simon--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Hi Simon ! Well, I''m, at the moment , trying to do the same think !! Looks like calling self.delete at the end of the do_work method of a worker is a bad idea ... In fact, a worker cannot delete itself, looks like. What I''m thinking right now would be a sort of ... worker that would act has a cleaner ... Let say, you have a worker that do some email check. Step1 -> an entry is created in a jobs table with job.cmd = "command to run the email check", job.key_job = " unique id for this job" and job.status = "Waiting" Step2 -> you have a schedule worker that every 30 minutes, for example, look at the jobs table, and create worker that have the waiting status .... ( so 1 row in the jobs table becomes a worker soon or later) Step3 -> every "waiting" worker that are now running can then update the "jobs" table to say "hey I''m finish" so job.status = "finished" Step4 -> the cleaner (the schedule worker that wakes up every 30 minutes) re-check for "Waiting jobs" but also look for "finished jobs" and clean them ... ''cos a woker can clean another one ... Don''t know if that make sence ... it is just an "idea" that i''m having right now ... (and it''s 2h00 - not 14h00 !- over here in France ;-) ) Anyway, I might try to implement such a "job cleaner" tomorrow and have a try ... PS : BUT IF SOMEONE''S GOT AN IDEA ON HOW A WORKER CAN KILL HIMSELF ... I WOULD RATHER TAKE IT ! Jules On 10 avr, 15:42, "Simon" <simon.wilkin...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> Hi, > > I am trying to get a worker instance to delete itself at the end of > its do_work method. I have my main rails app creating these workers > upon certain incoming http requests to parse some XML files, and once > the parsing is complete, I would like the worker to delete itself, so > that I don''t need to try and manage several workers within the main > rails app. > > I was trying to accomplish this with the following > line: ::BackgrounDRb::MiddleMan.instance.delete_worker @_job_key. > However, when I tried this, I get the following errer: > > 20070405-13:15:15 (19653) In do work > 20070405-13:15:18 (19653) You have a nil object when you didn''t expect > it! > The error occured while evaluating nil.shutdown - (NoMethodError) > > It seems that perhaps this method of trying to access the job key of > the current instance is not working. Has anybody else done something > similar, or have any suggestions for a different method to accomplish > this? > > Thanks, > > Simon--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Hi Jules,> In fact, a worker cannot delete itself, looks like.It definitely can. I use the following two lines to do it. The first makes sure the database connection doesn''t hang around. The second line looks just like Simon''s and it works. ActiveRecord::Base.connection.disconnect! ::BackgrounDRb::MiddleMan.instance.delete_worker @_job_key Hi Simon, Simon wrote:>> I was trying to accomplish this with the following >> line: ::BackgrounDRb::MiddleMan.instance.delete_worker @_job_key.That looks correct.>> However, when I tried this, I get the following errer: >> >> 20070405-13:15:15 (19653) In do work >> 20070405-13:15:18 (19653) You have a nil object when you didn''t expect >> it! >> The error occured while evaluating nil.shutdown - (NoMethodError)The error says you''re calling a ''shutdown'' method on an object that doesn''t exist. Maybe you could show us some code? Bill --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Hi Bill,
Thanks for the reply.
I tried the
"::BackgrounDRb::MiddleMan.instance.delete_worker @_job_key " but I
get the same error as Simon :
"The error occured while evaluating nil.shutdown"
now here is the worker :
********* worker code starts here **************
class ProgressWorker < BackgrounDRb::Worker::RailsBase
attr_accessor :temp_key
def do_work(args)
cmdoutput = []
results[:worker_status] = false.to_s
filefrom = "video.mov"
fileto = "video.flv"
encode_cmd=''ffmpeg -i ''+filefrom+'' -b 600k -r 24
-ar 22050 -ab 96
''+fileto
IO.popen(encode_cmd).each do |line|
cmdoutput << line
results[:worker_result] = cmdoutput
end
results[:worker_status] = true.to_s
ActiveRecord::Base.connection.disconnect!
::BackgrounDRb::MiddleMan.instance.delete_worker @_job_key
end
end
ProgressWorker.register
********* worker code ends here **************
control calls this worker with :
::MiddleMan.new_worker(:class => :progress_worker)
Now, I''m trying to understand what is going ... :
Is this worker properly registered ???? ( I have
ProgressWorker.register after (at the end, end ;-) ) the class
declaration in ProgressWorker.rb ...)
@_job_key is an instance variable but ... is not defined anywhere ? is
@_job_key automatically created when a worker is called ? if so .. may
be I should specify a :job_key when creating it ?
Thanks for all your help !
Julien
On 14 avr, 15:26, "Bill Walton"
<bill.wal...-xwVYE8SWAR3R7s880joybQ@public.gmane.org>
wrote:> Hi Jules,
>
> > In fact, a worker cannot delete itself, looks like.
>
> It definitely can. I use the following two lines to do it. The first
makes
> sure the database connection doesn''t hang around. The second line
looks
> just like Simon''s and it works.
>
> ActiveRecord::Base.connection.disconnect!
> ::BackgrounDRb::MiddleMan.instance.delete_worker @_job_key
>
> Hi Simon,
>
> Simon wrote:
> >> I was trying to accomplish this with the following
> >> line: ::BackgrounDRb::MiddleMan.instance.delete_worker @_job_key.
>
> That looks correct.
>
> >> However, when I tried this, I get the following errer:
>
> >> 20070405-13:15:15 (19653) In do work
> >> 20070405-13:15:18 (19653) You have a nil object when you
didn''t expect
> >> it!
> >> The error occured while evaluating nil.shutdown - (NoMethodError)
>
> The error says you''re calling a ''shutdown''
method on an object that doesn''t
> exist. Maybe you could show us some code?
>
> Bill
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---
yo !
Some improuvment ... but not yet finished ...
when I logged the @_job_key I receive ... an error complaining about
nil string ...
I looked in the worker.rb code and found .... @jobkey ... so I gave it
a try and tada !
when i do :
logger.error(@jobkey) { "Job Key called with @jobkey : "+@jobkey }
I get
20070416-01:34:00 (1269) Job Key called with @jobkey :
34b21fe088389b080578fd83dc1b47ea
but when I do :
logger.error(@jobkey) { "Job Key called with @jobkey : "+@_job_key }
I get
20070416-01:34:00 (1269) can''t convert nil into String - (TypeError)
So sounds liek @_job_key does not exists ... but @jobkey does ...
(But sorry simon, yhis does not resolve the .shutdown nil for the
moment ... I keep seraching ...)
jules
On 16 avr, 01:19, "Jules"
<jdelgou...-GANU6spQydw@public.gmane.org> wrote:> Hi Bill,
>
> Thanks for the reply.
> I tried the
> "::BackgrounDRb::MiddleMan.instance.delete_worker @_job_key " but
I
> get the same error as Simon :
> "The error occured while evaluating nil.shutdown"
>
> now here is the worker :
>
> ********* worker code starts here **************
>
> class ProgressWorker < BackgrounDRb::Worker::RailsBase
>
> attr_accessor :temp_key
>
> def do_work(args)
>
> cmdoutput = []
> results[:worker_status] = false.to_s
>
> filefrom = "video.mov"
> fileto = "video.flv"
>
> encode_cmd=''ffmpeg -i ''+filefrom+'' -b 600k
-r 24 -ar 22050 -ab 96
> ''+fileto
>
> IO.popen(encode_cmd).each do |line|
> cmdoutput << line
> results[:worker_result] = cmdoutput
> end
>
> results[:worker_status] = true.to_s
> ActiveRecord::Base.connection.disconnect!
> ::BackgrounDRb::MiddleMan.instance.delete_worker @_job_key
>
> end
> end
>
> ProgressWorker.register
>
> ********* worker code ends here **************
>
> control calls this worker with :
>
> ::MiddleMan.new_worker(:class => :progress_worker)
>
> Now, I''m trying to understand what is going ... :
>
> Is this worker properly registered ???? ( I have
> ProgressWorker.register after (at the end, end ;-) ) the class
> declaration in ProgressWorker.rb ...)
> @_job_key is an instance variable but ... is not defined anywhere ? is
> @_job_key automatically created when a worker is called ? if so .. may
> be I should specify a :job_key when creating it ?
>
> Thanks for all your help !
>
> Julien
>
> On 14 avr, 15:26, "Bill Walton"
<bill.wal...-xwVYE8SWAR3R7s880joybQ@public.gmane.org> wrote:
>
> > Hi Jules,
>
> > > In fact, a worker cannot delete itself, looks like.
>
> > It definitely can. I use the following two lines to do it. The first
makes
> > sure the database connection doesn''t hang around. The second
line looks
> > just like Simon''s and it works.
>
> > ActiveRecord::Base.connection.disconnect!
> > ::BackgrounDRb::MiddleMan.instance.delete_worker @_job_key
>
> > Hi Simon,
>
> > Simon wrote:
> > >> I was trying to accomplish this with the following
> > >> line: ::BackgrounDRb::MiddleMan.instance.delete_worker
@_job_key.
>
> > That looks correct.
>
> > >> However, when I tried this, I get the following errer:
>
> > >> 20070405-13:15:15 (19653) In do work
> > >> 20070405-13:15:18 (19653) You have a nil object when you
didn''t expect
> > >> it!
> > >> The error occured while evaluating nil.shutdown -
(NoMethodError)
>
> > The error says you''re calling a ''shutdown''
method on an object that doesn''t
> > exist. Maybe you could show us some code?
>
> > Bill
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---
Me again .... more testing going on ...
in the worker, I do :
logger.error(@jobkey) { ::BackgrounDRb::MiddleMan.instance.jobs}
when I look at the log I see :
backgroundrb_logger#<Slave:0x24caef8>backgroundrb_results#<Slave:
0x24b6318>
Looks like the only workers available are the logger and the
result .... where is my worker ????
I understand now why we get :
You have a nil object when you didn''t expect it!
The error occurred while evaluating nil.shutdown - (NoMethodError)
-> there no job with my job_key !
I''m lost ....
On 16 avr, 01:19, "Jules"
<jdelgou...-GANU6spQydw@public.gmane.org> wrote:> Hi Bill,
>
> Thanks for the reply.
> I tried the
> "::BackgrounDRb::MiddleMan.instance.delete_worker @_job_key " but
I
> get the same error as Simon :
> "The error occured while evaluating nil.shutdown"
>
> now here is the worker :
>
> ********* worker code starts here **************
>
> class ProgressWorker < BackgrounDRb::Worker::RailsBase
>
> attr_accessor :temp_key
>
> def do_work(args)
>
> cmdoutput = []
> results[:worker_status] = false.to_s
>
> filefrom = "video.mov"
> fileto = "video.flv"
>
> encode_cmd=''ffmpeg -i ''+filefrom+'' -b 600k
-r 24 -ar 22050 -ab 96
> ''+fileto
>
> IO.popen(encode_cmd).each do |line|
> cmdoutput << line
> results[:worker_result] = cmdoutput
> end
>
> results[:worker_status] = true.to_s
> ActiveRecord::Base.connection.disconnect!
> ::BackgrounDRb::MiddleMan.instance.delete_worker @_job_key
>
> end
> end
>
> ProgressWorker.register
>
> ********* worker code ends here **************
>
> control calls this worker with :
>
> ::MiddleMan.new_worker(:class => :progress_worker)
>
> Now, I''m trying to understand what is going ... :
>
> Is this worker properly registered ???? ( I have
> ProgressWorker.register after (at the end, end ;-) ) the class
> declaration in ProgressWorker.rb ...)
> @_job_key is an instance variable but ... is not defined anywhere ? is
> @_job_key automatically created when a worker is called ? if so .. may
> be I should specify a :job_key when creating it ?
>
> Thanks for all your help !
>
> Julien
>
> On 14 avr, 15:26, "Bill Walton"
<bill.wal...-xwVYE8SWAR3R7s880joybQ@public.gmane.org> wrote:
>
> > Hi Jules,
>
> > > In fact, a worker cannot delete itself, looks like.
>
> > It definitely can. I use the following two lines to do it. The first
makes
> > sure the database connection doesn''t hang around. The second
line looks
> > just like Simon''s and it works.
>
> > ActiveRecord::Base.connection.disconnect!
> > ::BackgrounDRb::MiddleMan.instance.delete_worker @_job_key
>
> > Hi Simon,
>
> > Simon wrote:
> > >> I was trying to accomplish this with the following
> > >> line: ::BackgrounDRb::MiddleMan.instance.delete_worker
@_job_key.
>
> > That looks correct.
>
> > >> However, when I tried this, I get the following errer:
>
> > >> 20070405-13:15:15 (19653) In do work
> > >> 20070405-13:15:18 (19653) You have a nil object when you
didn''t expect
> > >> it!
> > >> The error occured while evaluating nil.shutdown -
(NoMethodError)
>
> > The error says you''re calling a ''shutdown''
method on an object that doesn''t
> > exist. Maybe you could show us some code?
>
> > Bill
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---
Hi Jules Jules wrote:> I tried the > "::BackgrounDRb::MiddleMan.instance.delete_worker @_job_key " but I > get the same error as Simon : > "The error occured while evaluating nil.shutdown" > > now here is the worker : > control calls this worker with : > > ::MiddleMan.new_worker(:class => :progress_worker) > > > Now, I''m trying to understand what is going ... : > > Is this worker properly registered ???? ( I have > ProgressWorker.register after (at the end, end ;-) ) the class > declaration in ProgressWorker.rb ...) > @_job_key is an instance variable but ... is not defined anywhere ? is > @_job_key automatically created when a worker is called ? if so .. may > be I should specify a :job_key when creating it ?I start the worker with: session[:job_key] = MiddleMan.new_worker(.... Maybe that''s it? hth, Bill --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Hi Bill,
I will have a try with the session[:job_key] but ...
Looks lile self.delete in the do_work method do the job ...
Here is a test to confirm this :
At the end of the do_work method I put this :
results[:worker_status] = true
logger.error(@jobkey) { "Worker status :
"+results[:worker_status].to_s }
And, in return I''ve got in the log : Worker status : true
Now .... if I call this instead :
results[:worker_status] = true
self.delete
logger.error(@jobkey) { "Worker status :
"+results[:worker_status].to_s }
I''ve got nothing in my log ... why ?
Simply because results for worker are kept until worker is deleted.
So, if i cannot this "Worker status : true " in the log it is because
the worker has been deleted ....
So, my conclusion is : self.delete works ;-)
PS : please let me know if you think that this test does not confirm
the fact that calling self.delete, really kill the worker ;-)
On 16 avr, 05:34, "Bill Walton"
<bill.wal...-xwVYE8SWAR3R7s880joybQ@public.gmane.org>
wrote:> Hi Jules
>
>
>
> Jules wrote:
> > I tried the
> > "::BackgrounDRb::MiddleMan.instance.delete_worker @_job_key
" but I
> > get the same error as Simon :
> > "The error occured while evaluating nil.shutdown"
>
> > now here is the worker :
> > control calls this worker with :
>
> > ::MiddleMan.new_worker(:class => :progress_worker)
>
> > Now, I''m trying to understand what is going ... :
>
> > Is this worker properly registered ???? ( I have
> > ProgressWorker.register after (at the end, end ;-) ) the class
> > declaration in ProgressWorker.rb ...)
> > @_job_key is an instance variable but ... is not defined anywhere ? is
> > @_job_key automatically created when a worker is called ? if so .. may
> > be I should specify a :job_key when creating it ?
>
> I start the worker with:
> session[:job_key] = MiddleMan.new_worker(....
>
> Maybe that''s it?
>
> hth,
> Bill
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---