Add hooks to ActiveJob around retries and discards

This commit is contained in:
Steve S 2018-08-29 13:28:55 -04:00
parent 7e881a18d9
commit 26dc9bc8ee
No known key found for this signature in database
GPG Key ID: BE0ADD2E321CD624
3 changed files with 53 additions and 7 deletions

View File

@ -1,3 +1,7 @@
* Added `enqueue_retry.active_job`, `retry_stopped.active_job`, and `discard.active_job` hooks.
*steves*
* Allow `assert_performed_with` to be called without a block. * Allow `assert_performed_with` to be called without a block.
*bogdanvlviv* *bogdanvlviv*

View File

@ -44,12 +44,22 @@ module ActiveJob
# end # end
def retry_on(*exceptions, wait: 3.seconds, attempts: 5, queue: nil, priority: nil) def retry_on(*exceptions, wait: 3.seconds, attempts: 5, queue: nil, priority: nil)
rescue_from(*exceptions) do |error| rescue_from(*exceptions) do |error|
payload = {
job: self,
adapter: self.class.queue_adapter,
error: error,
}
if executions < attempts if executions < attempts
logger.error "Retrying #{self.class} in #{wait} seconds, due to a #{error.class}. The original exception was #{error.cause.inspect}." ActiveSupport::Notifications.instrument("enqueue_retry.active_job", payload) do
retry_job wait: determine_delay(wait), queue: queue, priority: priority logger.error "Retrying #{self.class} in #{wait} seconds, due to a #{error.class}. The original exception was #{error.cause.inspect}."
retry_job wait: determine_delay(wait), queue: queue, priority: priority
end
else else
if block_given? if block_given?
yield self, error ActiveSupport::Notifications.instrument("retry_stopped.active_job", payload) do
yield self, error
end
else else
logger.error "Stopped retrying #{self.class} due to a #{error.class}, which reoccurred on #{executions} attempts. The original exception was #{error.cause.inspect}." logger.error "Stopped retrying #{self.class} due to a #{error.class}, which reoccurred on #{executions} attempts. The original exception was #{error.cause.inspect}."
raise error raise error
@ -78,10 +88,18 @@ module ActiveJob
# end # end
def discard_on(*exceptions) def discard_on(*exceptions)
rescue_from(*exceptions) do |error| rescue_from(*exceptions) do |error|
if block_given? payload = {
yield self, error job: self,
else adapter: self.class.queue_adapter,
logger.error "Discarded #{self.class} due to a #{error.class}. The original exception was #{error.cause.inspect}." error: error,
}
ActiveSupport::Notifications.instrument("discard.active_job", payload) do
if block_given?
yield self, error
else
logger.error "Discarded #{self.class} due to a #{error.class}. The original exception was #{error.cause.inspect}."
end
end end
end end
end end

View File

@ -458,6 +458,14 @@ Active Job
| `:adapter` | QueueAdapter object processing the job | | `:adapter` | QueueAdapter object processing the job |
| `:job` | Job object | | `:job` | Job object |
### enqueue_retry.active_job
| Key | Value |
| ------------ | -------------------------------------- |
| `:job` | Job object |
| `:adapter` | QueueAdapter object processing the job |
| `:error` | The error that caused the retry |
### perform_start.active_job ### perform_start.active_job
| Key | Value | | Key | Value |
@ -472,6 +480,22 @@ Active Job
| `:adapter` | QueueAdapter object processing the job | | `:adapter` | QueueAdapter object processing the job |
| `:job` | Job object | | `:job` | Job object |
### retry_stopped.active_job
| Key | Value |
| ------------ | -------------------------------------- |
| `:adapter` | QueueAdapter object processing the job |
| `:job` | Job object |
| `:error` | The error that caused the retry |
### discard.active_job
| Key | Value |
| ------------ | -------------------------------------- |
| `:adapter` | QueueAdapter object processing the job |
| `:job` | Job object |
| `:error` | The error that caused the discard |
Action Cable Action Cable
------------ ------------