mirror of
https://github.com/mperham/sidekiq.git
synced 2022-11-09 13:52:34 -05:00
Allow global retries exhausted handler, fixes #2807
This commit is contained in:
parent
8761a23c20
commit
ec1b38eb5b
4 changed files with 63 additions and 19 deletions
12
Changes.md
12
Changes.md
|
@ -1,5 +1,17 @@
|
|||
# Sidekiq Changes
|
||||
|
||||
HEAD
|
||||
-----------
|
||||
|
||||
- Allow definition of a global retries_exhausted handler. [#2807]
|
||||
```ruby
|
||||
Sidekiq.configure_server do |config|
|
||||
config.default_retries_exhausted = -> (job, ex) do
|
||||
Sidekiq.logger.info "#{job['class']} job is now dead"
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
4.1.0
|
||||
-----------
|
||||
|
||||
|
|
|
@ -44,7 +44,6 @@ module Sidekiq
|
|||
def self.options
|
||||
@options ||= DEFAULTS.dup
|
||||
end
|
||||
|
||||
def self.options=(opts)
|
||||
@options = opts
|
||||
end
|
||||
|
@ -132,15 +131,24 @@ module Sidekiq
|
|||
def self.default_worker_options=(hash)
|
||||
@default_worker_options = default_worker_options.merge(hash.stringify_keys)
|
||||
end
|
||||
|
||||
def self.default_worker_options
|
||||
defined?(@default_worker_options) ? @default_worker_options : DEFAULT_WORKER_OPTIONS
|
||||
end
|
||||
|
||||
# Sidekiq.configure_server do |config|
|
||||
# config.default_retries_exhausted = -> (job, ex) do
|
||||
# end
|
||||
# end
|
||||
def self.default_retries_exhausted=(prok)
|
||||
@default_retries_exhausted = prok
|
||||
end
|
||||
def self.default_retries_exhausted
|
||||
@default_retries_exhausted
|
||||
end
|
||||
|
||||
def self.load_json(string)
|
||||
JSON.parse(string)
|
||||
end
|
||||
|
||||
def self.dump_json(object)
|
||||
JSON.generate(object)
|
||||
end
|
||||
|
@ -148,7 +156,6 @@ module Sidekiq
|
|||
def self.logger
|
||||
Sidekiq::Logging.logger
|
||||
end
|
||||
|
||||
def self.logger=(log)
|
||||
Sidekiq::Logging.logger = log
|
||||
end
|
||||
|
|
|
@ -137,11 +137,10 @@ module Sidekiq
|
|||
end
|
||||
|
||||
def retries_exhausted(worker, msg, exception)
|
||||
logger.debug { "Dropping message after hitting the retry maximum: #{msg}" }
|
||||
logger.debug { "Retries exhausted for job" }
|
||||
begin
|
||||
if worker.sidekiq_retries_exhausted_block?
|
||||
worker.sidekiq_retries_exhausted_block.call(msg, exception)
|
||||
end
|
||||
block = worker.sidekiq_retries_exhausted_block || Sidekiq.default_retries_exhausted
|
||||
block.call(msg, exception) if block
|
||||
rescue => e
|
||||
handle_exception(e, { context: "Error calling retries_exhausted for #{worker.class}", job: msg })
|
||||
end
|
||||
|
|
|
@ -7,11 +7,11 @@ class TestRetryExhausted < Sidekiq::Test
|
|||
class NewWorker
|
||||
include Sidekiq::Worker
|
||||
|
||||
class_attribute :exhausted_called, :exhausted_message, :exhausted_exception
|
||||
class_attribute :exhausted_called, :exhausted_job, :exhausted_exception
|
||||
|
||||
sidekiq_retries_exhausted do |msg, e|
|
||||
sidekiq_retries_exhausted do |job, e|
|
||||
self.exhausted_called = true
|
||||
self.exhausted_message = msg
|
||||
self.exhausted_job = job
|
||||
self.exhausted_exception = e
|
||||
end
|
||||
end
|
||||
|
@ -19,18 +19,18 @@ class TestRetryExhausted < Sidekiq::Test
|
|||
class OldWorker
|
||||
include Sidekiq::Worker
|
||||
|
||||
class_attribute :exhausted_called, :exhausted_message, :exhausted_exception
|
||||
class_attribute :exhausted_called, :exhausted_job, :exhausted_exception
|
||||
|
||||
sidekiq_retries_exhausted do |msg|
|
||||
sidekiq_retries_exhausted do |job|
|
||||
self.exhausted_called = true
|
||||
self.exhausted_message = msg
|
||||
self.exhausted_job = job
|
||||
end
|
||||
end
|
||||
|
||||
def cleanup
|
||||
[NewWorker, OldWorker].each do |worker_class|
|
||||
worker_class.exhausted_called = nil
|
||||
worker_class.exhausted_message = nil
|
||||
worker_class.exhausted_job = nil
|
||||
worker_class.exhausted_exception = nil
|
||||
end
|
||||
end
|
||||
|
@ -96,7 +96,7 @@ class TestRetryExhausted < Sidekiq::Test
|
|||
end
|
||||
|
||||
|
||||
it 'passes message and exception to retries exhausted block' do
|
||||
it 'passes job and exception to retries exhausted block' do
|
||||
raised_error = assert_raises RuntimeError do
|
||||
handler.call(new_worker, job('retry_count' => 0, 'retry' => 1), 'default') do
|
||||
raise 'kerblammo!'
|
||||
|
@ -104,11 +104,11 @@ class TestRetryExhausted < Sidekiq::Test
|
|||
end
|
||||
|
||||
assert new_worker.exhausted_called?
|
||||
assert_equal raised_error.message, new_worker.exhausted_message['error_message']
|
||||
assert_equal raised_error.message, new_worker.exhausted_job['error_message']
|
||||
assert_equal raised_error, new_worker.exhausted_exception
|
||||
end
|
||||
|
||||
it 'passes message to retries exhausted block' do
|
||||
it 'passes job to retries exhausted block' do
|
||||
raised_error = assert_raises RuntimeError do
|
||||
handler.call(old_worker, job('retry_count' => 0, 'retry' => 1), 'default') do
|
||||
raise 'kerblammo!'
|
||||
|
@ -116,8 +116,34 @@ class TestRetryExhausted < Sidekiq::Test
|
|||
end
|
||||
|
||||
assert old_worker.exhausted_called?
|
||||
assert_equal raised_error.message, old_worker.exhausted_message['error_message']
|
||||
assert_equal raised_error.message, old_worker.exhausted_job['error_message']
|
||||
assert_equal nil, new_worker.exhausted_exception
|
||||
end
|
||||
|
||||
it 'allows a global default handler' do
|
||||
begin
|
||||
class Foobar
|
||||
include Sidekiq::Worker
|
||||
end
|
||||
|
||||
exhausted_job = nil
|
||||
exhausted_exception = nil
|
||||
Sidekiq.default_retries_exhausted = -> (job, ex) do
|
||||
exhausted_job = job
|
||||
exhausted_exception = ex
|
||||
end
|
||||
f = Foobar.new
|
||||
raised_error = assert_raises RuntimeError do
|
||||
handler.call(f, job('retry_count' => 0, 'retry' => 1), 'default') do
|
||||
raise 'kerblammo!'
|
||||
end
|
||||
end
|
||||
|
||||
assert exhausted_job
|
||||
assert_equal raised_error, exhausted_exception
|
||||
ensure
|
||||
Sidekiq.default_retries_exhausted = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Add table
Reference in a new issue