Class: Shoryuken::Middleware::Server::ExponentialBackoffRetry
- Inherits:
-
Object
- Object
- Shoryuken::Middleware::Server::ExponentialBackoffRetry
- Includes:
- Util
- Defined in:
- lib/shoryuken/middleware/server/exponential_backoff_retry.rb
Overview
Middleware that implements exponential backoff retry for failed messages. When a job fails, the message visibility timeout is adjusted based on configured retry intervals.
Instance Method Summary collapse
-
#call(worker, _queue, sqs_msg, _body) { ... } ⇒ void
Processes a message with exponential backoff retry on failure.
Methods included from Util
#elapsed, #fire_event, #logger, #unparse_queues, #worker_name
Instance Method Details
#call(worker, _queue, sqs_msg, _body) { ... } ⇒ void
This method returns an undefined value.
Processes a message with exponential backoff retry on failure
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
# File 'lib/shoryuken/middleware/server/exponential_backoff_retry.rb', line 22 def call(worker, _queue, sqs_msg, _body) return yield unless worker.class.exponential_backoff? if sqs_msg.is_a?(Array) logger.warn { "Exponential backoff isn't supported for batch workers" } return yield end started_at = Time.now yield rescue => e = worker.class. retry_intervals = ['retry_intervals'] # Non-retryable exceptions must not be backoff retried; re-raise so the # NonRetryableException middleware can delete the message immediately. raise if NonRetryableException.non_retryable?(e, ['non_retryable_exceptions']) if retry_intervals.nil? || !handle_failure(sqs_msg, started_at, retry_intervals) # Re-raise the exception if the job is not going to be exponential backoff retried. # This allows custom middleware (like exception notifiers) to be aware of the unhandled failure. raise end logger.warn { "Message #{sqs_msg.} will attempt retry due to error: #{e.}" } # since we didn't raise, lets log the backtrace for debugging purposes. logger.debug { e.backtrace.join("\n") } unless e.backtrace.nil? end |