Add exception handling with built-in retry options

This commit is contained in:
David Heinemeier Hansson 2014-05-22 20:35:02 +02:00
parent 387a7d9935
commit ef4aff07a4
5 changed files with 52 additions and 1 deletions

@ -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

@ -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(*)

@ -1,5 +1,4 @@
require 'helper'
require 'active_job/arguments'
require 'jobs/callback_job'
require 'active_support/core_ext/object/inclusion'

16
test/cases/rescue_test.rb Normal file

@ -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
test/jobs/rescue_job.rb Normal file

@ -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