Skip to content
This repository has been archived by the owner on Nov 9, 2017. It is now read-only.

Commit

Permalink
Add exception handling with built-in retry options
Browse files Browse the repository at this point in the history
  • Loading branch information
dhh committed May 22, 2014
1 parent 387a7d9 commit ef4aff0
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 1 deletion.
12 changes: 12 additions & 0 deletions lib/active_job/enqueuing.rb
Original file line number Diff line number Diff line change
Expand Up @@ -55,5 +55,17 @@ def enqueue_at(timestamp, *args)
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
9 changes: 9 additions & 0 deletions lib/active_job/performing.rb
Original file line number Diff line number Diff line change
@@ -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(*)
Expand Down
1 change: 0 additions & 1 deletion test/cases/callbacks_test.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
require 'helper'
require 'active_job/arguments'
require 'jobs/callback_job'

require 'active_support/core_ext/object/inclusion'
Expand Down
16 changes: 16 additions & 0 deletions test/cases/rescue_test.rb
Original file line number Diff line number Diff line change
@@ -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
15 changes: 15 additions & 0 deletions test/jobs/rescue_job.rb
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit ef4aff0

Please sign in to comment.