Hi, Don''t know if it''s the right address but I''m seeking help with my workers. I have two problems related to workers and backgroundrb: 1) I have a worker that uses soap/wsdlDriver and it''s set to autoload and starts called by controller. This only makes a simple SOAP communication. It works most of the times. But sometimes worker dies and the reason is related with some timeout related with httpclient gem. When it dies it''s a pain to make it work again. Down it''s the code of my controller: def index prepare_job @id = "prepare" render ''admin/importar/worker'' end def import execute_job @id = "execute" render ''admin/importar/worker'' end def prepare_job start_worker("PREPARE_IMPORT") end def execute_job start_worker("EXECUTE_IMPORT") end def start_worker(action) worker = MiddleMan.ask_status(:worker => :iif_worker) if worker != nil && worker[:progress] < 4 flash[:notice] = "J?? existe um processo de importa????o a decorrer!" else MiddleMan.ask_work(:worker => :iif_worker, :worker_method => :do_work, :data => action) session[:job_key] = :import end end def get_progress if request.xhr? worker = MiddleMan.ask_status(:worker => :iif_worker) return if worker == nil progress_percent = worker[:progress] render :update do |page| page.call(''progressPercent'', ''progressbar'', progress_percent) if progress_percent >= 100 @info = worker[:info] @total = worker[:total] if params[:id] == "prepare" page.replace_html ''import_content'', :partial => ''admin/importar/todo'' elsif params[:id] == "execute" flash[:notice] = "#{@total} marcas importas com sucesso!" page.replace_html ''import_content'', :partial => ''admin/importar/done'' end end end else redirect_to :action => ''index'' end end And below some code of worker: require ''rexml/document'' require ''soap/wsdlDriver'' require ''xsd/mapping'' class IifWorker < BackgrounDRb::MetaWorker set_worker_name :iif_worker #set_no_auto_load(true) #attr_reader :progress, :info, :total #def create(args = nil) # register_status(''Dass'') # Thread.abort_on_exception = true #end def do_work(action) @progress = 0 update_status if action == "PREPARE_IMPORT" prepare_import elsif action == "EXECUTE_IMPORT" execute_import end @progress = 100 update_status end def prepare_import stuff, chave = auth_and_query results = stuff.goldMineData.record @total = results.size @progress = 15 @increment = ("%4.2f" % ((100.0 - @progress) / results.size)).to_f @info = findRecordsToUpdate(results) update_status @soap.reset_stream end def execute_import stuff, chave = auth_and_query results = stuff.goldMineData.record @total = results.size @progress = 15 @increment = ("%4.2f" % ((100.0 - @progress) / results.size)).to_f @info = updateRecords(stuff.goldMineData.record) #@soap.UpdateGoldmine(:Key=>chave) update_status @soap.reset_stream end def auth_and_query factory = SOAP::WSDLDriverFactory.new(" http://infofranchisingwsp.ife.pt:8081/infofranchisingUpdateService.asmx?WSDL ") @soap = factory.create_rpc_driver soapResponse = @soap.GetToken(nil) token = soapResponse.getTokenResult chave = authenticate(token) @progress = 5 update_status soapResponseXML = @soap.GetXML(:Key=>chave) @progress = 10 update_status return soapResponseXML.getXMLResult, chave end def update_status register_status({:progress => @progress, :info => @info, :total => @total}) end def increment_progress @progress += @increment @progress = ("%3.2f" % @progress).to_f @progress = 100 if @progress > 100 end def findRecordsToUpdate(results) (...) Can you help me solve this problem? Thanks in advance, Diogo Silva -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://rubyforge.org/pipermail/backgroundrb-devel/attachments/20090120/e1923403/attachment.html>
You can handle the exception. Http exception would be either timeout or generic Exception class and hence wrap your external service invocation code in: begin # do some work rescue Timeout::Error # timeout error rescue # something else end It should do the trick. On Wed, Jan 21, 2009 at 2:16 AM, Diogo Silva <diogo.silva at w20.pt> wrote:> Hi, > Don''t know if it''s the right address but I''m seeking help with my workers. > > I have two problems related to workers and backgroundrb: > > 1) I have a worker that uses soap/wsdlDriver and it''s set to autoload and > starts called by controller. This only makes a simple SOAP communication. It > works most of the times. But sometimes worker dies and the reason is related > with some timeout related with httpclient gem. When it dies it''s a pain to > make it work again. > Down it''s the code of my controller: > > def index > prepare_job > @id = "prepare" > render ''admin/importar/worker'' > end > > def import > execute_job > @id = "execute" > render ''admin/importar/worker'' > end > > def prepare_job > start_worker("PREPARE_IMPORT") > end > > def execute_job > start_worker("EXECUTE_IMPORT") > end > > def start_worker(action) > worker = MiddleMan.ask_status(:worker => :iif_worker) > > if worker != nil && worker[:progress] < 4 > flash[:notice] = "J?? existe um processo de importa????o a decorrer!" > else > MiddleMan.ask_work(:worker => :iif_worker, :worker_method => :do_work, > :data => action) > session[:job_key] = :import > end > end > > def get_progress > if request.xhr? > worker = MiddleMan.ask_status(:worker => :iif_worker) > return if worker == nil > > progress_percent = worker[:progress] > render :update do |page| > page.call(''progressPercent'', ''progressbar'', progress_percent) > if progress_percent >= 100 > @info = worker[:info] > @total = worker[:total] > if params[:id] == "prepare" > page.replace_html ''import_content'', :partial => > ''admin/importar/todo'' > elsif params[:id] == "execute" > flash[:notice] = "#{@total} marcas importas com sucesso!" > page.replace_html ''import_content'', :partial => > ''admin/importar/done'' > end > end > end > else > redirect_to :action => ''index'' > end > end > > And below some code of worker: > > require ''rexml/document'' > require ''soap/wsdlDriver'' > require ''xsd/mapping'' > > class IifWorker < BackgrounDRb::MetaWorker > set_worker_name :iif_worker > #set_no_auto_load(true) > #attr_reader :progress, :info, :total > > #def create(args = nil) > # register_status(''Dass'') > # Thread.abort_on_exception = true > #end > > def do_work(action) > @progress = 0 > update_status > if action == "PREPARE_IMPORT" > prepare_import > elsif action == "EXECUTE_IMPORT" > execute_import > end > @progress = 100 > update_status > end > > def prepare_import > stuff, chave = auth_and_query > results = stuff.goldMineData.record > > @total = results.size > @progress = 15 > @increment = ("%4.2f" % ((100.0 - @progress) / results.size)).to_f > @info = findRecordsToUpdate(results) > > update_status > > @soap.reset_stream > end > > def execute_import > stuff, chave = auth_and_query > results = stuff.goldMineData.record > > @total = results.size > @progress = 15 > @increment = ("%4.2f" % ((100.0 - @progress) / results.size)).to_f > @info = updateRecords(stuff.goldMineData.record) > #@soap.UpdateGoldmine(:Key=>chave) > > update_status > > @soap.reset_stream > end > > def auth_and_query > factory > SOAP::WSDLDriverFactory.new("http://infofranchisingwsp.ife.pt:8081/infofranchisingUpdateService.asmx?WSDL") > @soap = factory.create_rpc_driver > soapResponse = @soap.GetToken(nil) > token = soapResponse.getTokenResult > > chave = authenticate(token) > @progress = 5 > update_status > soapResponseXML = @soap.GetXML(:Key=>chave) > @progress = 10 > update_status > > return soapResponseXML.getXMLResult, chave > end > > def update_status > register_status({:progress => @progress, :info => @info, :total => > @total}) > end > > def increment_progress > @progress += @increment > @progress = ("%3.2f" % @progress).to_f > @progress = 100 if @progress > 100 > end > > def findRecordsToUpdate(results) > (...) > > Can you help me solve this problem? > > Thanks in advance, > Diogo Silva > > _______________________________________________ > Backgroundrb-devel mailing list > Backgroundrb-devel at rubyforge.org > http://rubyforge.org/mailman/listinfo/backgroundrb-devel >-- Let them talk of their oriental summer climes of everlasting conservatories; give me the privilege of making my own summer with my own coals. http://gnufied.org
If my memory you mean - result cache, you should definitely use memcache in production. But i think you are using rather old version of the plugin and hence that option may not be available. On Wed, Jan 21, 2009 at 3:03 AM, Diogo Silva <diogo.silva at w20.pt> wrote:> Hi, > > Thanks for support and sorry for annoyance. I''ll try the solution tomorrow > morning and let you know if worked. > > Another question. I''m having also problems related to failure in allocating > memory with backgroundrb. Which is the best solution while configurating > backgroudrb.yml? > > Best Regards, > Diogo Silva > > 2009/1/20 hemant <gethemant at gmail.com> >> >> You can handle the exception. Http exception would be either timeout >> or generic Exception class and hence wrap your external service >> invocation code in: >> >> begin >> # do some work >> rescue Timeout::Error >> # timeout error >> rescue >> # something else >> end >> >> It should do the trick. >> >> >> >> On Wed, Jan 21, 2009 at 2:16 AM, Diogo Silva <diogo.silva at w20.pt> wrote: >> > Hi, >> > Don''t know if it''s the right address but I''m seeking help with my >> > workers. >> > >> > I have two problems related to workers and backgroundrb: >> > >> > 1) I have a worker that uses soap/wsdlDriver and it''s set to autoload >> > and >> > starts called by controller. This only makes a simple SOAP >> > communication. It >> > works most of the times. But sometimes worker dies and the reason is >> > related >> > with some timeout related with httpclient gem. When it dies it''s a pain >> > to >> > make it work again. >> > Down it''s the code of my controller: >> > >> > def index >> > prepare_job >> > @id = "prepare" >> > render ''admin/importar/worker'' >> > end >> > >> > def import >> > execute_job >> > @id = "execute" >> > render ''admin/importar/worker'' >> > end >> > >> > def prepare_job >> > start_worker("PREPARE_IMPORT") >> > end >> > >> > def execute_job >> > start_worker("EXECUTE_IMPORT") >> > end >> > >> > def start_worker(action) >> > worker = MiddleMan.ask_status(:worker => :iif_worker) >> > >> > if worker != nil && worker[:progress] < 4 >> > flash[:notice] = "J?? existe um processo de importa????o a >> > decorrer!" >> > else >> > MiddleMan.ask_work(:worker => :iif_worker, :worker_method => >> > :do_work, >> > :data => action) >> > session[:job_key] = :import >> > end >> > end >> > >> > def get_progress >> > if request.xhr? >> > worker = MiddleMan.ask_status(:worker => :iif_worker) >> > return if worker == nil >> > >> > progress_percent = worker[:progress] >> > render :update do |page| >> > page.call(''progressPercent'', ''progressbar'', progress_percent) >> > if progress_percent >= 100 >> > @info = worker[:info] >> > @total = worker[:total] >> > if params[:id] == "prepare" >> > page.replace_html ''import_content'', :partial => >> > ''admin/importar/todo'' >> > elsif params[:id] == "execute" >> > flash[:notice] = "#{@total} marcas importas com sucesso!" >> > page.replace_html ''import_content'', :partial => >> > ''admin/importar/done'' >> > end >> > end >> > end >> > else >> > redirect_to :action => ''index'' >> > end >> > end >> > >> > And below some code of worker: >> > >> > require ''rexml/document'' >> > require ''soap/wsdlDriver'' >> > require ''xsd/mapping'' >> > >> > class IifWorker < BackgrounDRb::MetaWorker >> > set_worker_name :iif_worker >> > #set_no_auto_load(true) >> > #attr_reader :progress, :info, :total >> > >> > #def create(args = nil) >> > # register_status(''Dass'') >> > # Thread.abort_on_exception = true >> > #end >> > >> > def do_work(action) >> > @progress = 0 >> > update_status >> > if action == "PREPARE_IMPORT" >> > prepare_import >> > elsif action == "EXECUTE_IMPORT" >> > execute_import >> > end >> > @progress = 100 >> > update_status >> > end >> > >> > def prepare_import >> > stuff, chave = auth_and_query >> > results = stuff.goldMineData.record >> > >> > @total = results.size >> > @progress = 15 >> > @increment = ("%4.2f" % ((100.0 - @progress) / results.size)).to_f >> > @info = findRecordsToUpdate(results) >> > >> > update_status >> > >> > @soap.reset_stream >> > end >> > >> > def execute_import >> > stuff, chave = auth_and_query >> > results = stuff.goldMineData.record >> > >> > @total = results.size >> > @progress = 15 >> > @increment = ("%4.2f" % ((100.0 - @progress) / results.size)).to_f >> > @info = updateRecords(stuff.goldMineData.record) >> > #@soap.UpdateGoldmine(:Key=>chave) >> > >> > update_status >> > >> > @soap.reset_stream >> > end >> > >> > def auth_and_query >> > factory >> > >> > SOAP::WSDLDriverFactory.new("http://infofranchisingwsp.ife.pt:8081/infofranchisingUpdateService.asmx?WSDL") >> > @soap = factory.create_rpc_driver >> > soapResponse = @soap.GetToken(nil) >> > token = soapResponse.getTokenResult >> > >> > chave = authenticate(token) >> > @progress = 5 >> > update_status >> > soapResponseXML = @soap.GetXML(:Key=>chave) >> > @progress = 10 >> > update_status >> > >> > return soapResponseXML.getXMLResult, chave >> > end >> > >> > def update_status >> > register_status({:progress => @progress, :info => @info, :total => >> > @total}) >> > end >> > >> > def increment_progress >> > @progress += @increment >> > @progress = ("%3.2f" % @progress).to_f >> > @progress = 100 if @progress > 100 >> > end >> > >> > def findRecordsToUpdate(results) >> > (...) >> > >> > Can you help me solve this problem? >> > >> > Thanks in advance, >> > Diogo Silva >> > >> > _______________________________________________ >> > Backgroundrb-devel mailing list >> > Backgroundrb-devel at rubyforge.org >> > http://rubyforge.org/mailman/listinfo/backgroundrb-devel >> > >> >> >> >> -- >> Let them talk of their oriental summer climes of everlasting >> conservatories; give me the privilege of making my own summer with my >> own coals. >> >> http://gnufied.org > >-- Let them talk of their oriental summer climes of everlasting conservatories; give me the privilege of making my own summer with my own coals. http://gnufied.org