diff options
author | David Heinemeier Hansson <david@loudthinking.com> | 2014-05-22 20:35:02 +0200 |
---|---|---|
committer | David Heinemeier Hansson <david@loudthinking.com> | 2014-05-22 20:35:02 +0200 |
commit | ef4aff07a41f1249baade695e68c75a8db3ded58 (patch) | |
tree | da3d9edc6f612a2f6106696fe423a5d8f1e5f28b | |
parent | 387a7d993573b1492b1ed39f6803acc77af9233b (diff) | |
download | rails-ef4aff07a41f1249baade695e68c75a8db3ded58.tar.gz rails-ef4aff07a41f1249baade695e68c75a8db3ded58.tar.bz2 rails-ef4aff07a41f1249baade695e68c75a8db3ded58.zip |
Add exception handling with built-in retry options
-rw-r--r-- | lib/active_job/enqueuing.rb | 12 | ||||
-rw-r--r-- | lib/active_job/performing.rb | 9 | ||||
-rw-r--r-- | test/cases/callbacks_test.rb | 1 | ||||
-rw-r--r-- | test/cases/rescue_test.rb | 16 | ||||
-rw-r--r-- | test/jobs/rescue_job.rb | 15 |
5 files changed, 52 insertions, 1 deletions
diff --git a/lib/active_job/enqueuing.rb b/lib/active_job/enqueuing.rb index 4ff7ec7e7f..0f094fb624 100644 --- a/lib/active_job/enqueuing.rb +++ b/lib/active_job/enqueuing.rb @@ -55,5 +55,17 @@ module ActiveJob def initialize(arguments = nil) @arguments = arguments end + + def retry_now + self.class.enqueue *arguments + end + + def retry_in(interval) + self.class.enqueue_in interval, *arguments + end + + def retry_at(timestamp) + self.class.enqueue_at timestamp, *arguments + end end end diff --git a/lib/active_job/performing.rb b/lib/active_job/performing.rb index ef17a39f85..c3f57873e5 100644 --- a/lib/active_job/performing.rb +++ b/lib/active_job/performing.rb @@ -1,13 +1,22 @@ +require 'active_support/rescuable' require 'active_job/arguments' module ActiveJob module Performing + extend ActiveSupport::Concern + + included do + include ActiveSupport::Rescuable + end + def perform_with_hooks(*serialized_args) self.arguments = Arguments.deserialize(serialized_args) run_callbacks :perform do perform *arguments end + rescue => exception + rescue_with_handler(exception) end def perform(*) diff --git a/test/cases/callbacks_test.rb b/test/cases/callbacks_test.rb index 06e2ea4a2e..104519dcb7 100644 --- a/test/cases/callbacks_test.rb +++ b/test/cases/callbacks_test.rb @@ -1,5 +1,4 @@ require 'helper' -require 'active_job/arguments' require 'jobs/callback_job' require 'active_support/core_ext/object/inclusion' diff --git a/test/cases/rescue_test.rb b/test/cases/rescue_test.rb new file mode 100644 index 0000000000..ca4c69f91b --- /dev/null +++ b/test/cases/rescue_test.rb @@ -0,0 +1,16 @@ +require 'helper' +require 'jobs/rescue_job' + +require 'active_support/core_ext/object/inclusion' + +class RescueTest < ActiveSupport::TestCase + setup do + $BUFFER = [] + end + + test 'rescue perform exception with retry' do + job = RescueJob.new + job.perform_with_hooks("david") + assert_equal [ "rescued from StandardError", "performed beautifully" ], $BUFFER + end +end diff --git a/test/jobs/rescue_job.rb b/test/jobs/rescue_job.rb new file mode 100644 index 0000000000..66b28d768e --- /dev/null +++ b/test/jobs/rescue_job.rb @@ -0,0 +1,15 @@ +class RescueJob < ActiveJob::Base + rescue_from(StandardError) do + $BUFFER << "rescued from StandardError" + arguments[0] = "DIFFERENT!" + retry_now + end + + def perform(person = "david") + if person == "david" + raise "Hair too good" + else + $BUFFER << "performed beautifully" + end + end +end |