From 00588816dc8d0221e1f1f7ca58202908a621e099 Mon Sep 17 00:00:00 2001 From: John Mettraux Date: Tue, 20 Apr 2010 17:20:13 +0900 Subject: [PATCH] keeping track of workitem fields as they were right before a participant error --- CHANGELOG.txt | 1 + TODO.txt | 2 +- lib/ruote/exp/flowexpression.rb | 12 ++++++++---- lib/ruote/worker.rb | 2 +- test/functional/ft_5_on_error.rb | 14 ++++++++------ 5 files changed, 19 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 42e8fda2..74f9b5fe 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -4,6 +4,7 @@ == ruote - 2.1.10 not yet released +- keeping track of workitem fields as they were right before a participant error - Workitem.error holds the error when on_error. Thanks Oleg. - Workitem#error and Workitem#timed_out shortcuts - participant :on_error => 'x' broken. Fixed. Thanks Oleg. diff --git a/TODO.txt b/TODO.txt index 40887db8..e480df54 100644 --- a/TODO.txt +++ b/TODO.txt @@ -199,7 +199,7 @@ [o] Rdoc Ruote::Engine.register_participant -> passing a block to a participant and perhaps also on http://ruote.rubyforge.org/implementing_participants.html (Avish) -[x] wrap workitem in process error ? for on_error consumption (thanks Oleg) +[o] wrap workitem in process error ? for on_error consumption (thanks Oleg) doing workitem.fields['__error__'] = [ fei, time, error_message ] [ ] exp : exp (restricted form of eval ?) diff --git a/lib/ruote/exp/flowexpression.rb b/lib/ruote/exp/flowexpression.rb index 462b3304..0a6c54f9 100644 --- a/lib/ruote/exp/flowexpression.rb +++ b/lib/ruote/exp/flowexpression.rb @@ -390,7 +390,7 @@ def cancel (flavour) def do_fail (msg) @h['state'] = 'failing' - @h['applied_workitem']['fields']['__error__'] = msg['error'] + @h['applied_workitem'] = msg['workitem'] if h.children.size < 1 reply_to_parent(@h['applied_workitem']) @@ -474,7 +474,7 @@ def lookup_on_error # Looks up parent with on_error attribute and triggers it # - def handle_on_error (error) + def handle_on_error (msg, error) return false if h.state == 'failing' @@ -488,11 +488,15 @@ def handle_on_error (error) return false if handler == '' # empty on_error handler nullifies ancestor's on_error + workitem = msg['workitem'] + + workitem['fields']['__error__'] = [ + h.fei, Ruote.now_to_utc_s, error.class.to_s, error.message ] + @context.storage.put_msg( 'fail', 'fei' => oe_parent.h.fei, - 'error' => [ - h.fei, Ruote.now_to_utc_s, error.class.to_s, error.message ]) + 'workitem' => workitem) true # yes, error is being handled. end diff --git a/lib/ruote/worker.rb b/lib/ruote/worker.rb index ba9bafc8..69424d2a 100644 --- a/lib/ruote/worker.rb +++ b/lib/ruote/worker.rb @@ -129,7 +129,7 @@ def handle_exception (msg, fexp, ex) fexp = Ruote::Exp::FlowExpression.fetch(@context, fei) end - return if fexp && fexp.handle_on_error(ex) + return if fexp && fexp.handle_on_error(msg, ex) # emit 'msg' diff --git a/test/functional/ft_5_on_error.rb b/test/functional/ft_5_on_error.rb index 0a3462a4..d09649a7 100644 --- a/test/functional/ft_5_on_error.rb +++ b/test/functional/ft_5_on_error.rb @@ -161,13 +161,14 @@ def test_participant_on_error end end - error = nil + workitem = nil - @engine.register_participant :troublemaker do + @engine.register_participant :troublemaker do |wi| + wi.fields['seen'] = true raise 'Beijing, we have a problem !' end - @engine.register_participant :troublespotter do |workitem| - error = workitem.error + @engine.register_participant :troublespotter do |wi| + workitem = wi @tracer << 'err...' end @@ -181,8 +182,9 @@ def test_participant_on_error #puts er.trace assert_equal 'err...', @tracer.to_s - assert_equal 4, error.size - assert_equal 'RuntimeError', error[2] + assert_equal 4, workitem.error.size + assert_equal 'RuntimeError', workitem.error[2] + assert_equal true, workitem.fields['seen'] end end