Class: CMDx::Retriers
- Inherits:
-
Object
- Object
- CMDx::Retriers
- Defined in:
- lib/cmdx/retriers.rb,
lib/cmdx/retriers/linear.rb,
lib/cmdx/retriers/fibonacci.rb,
lib/cmdx/retriers/exponential.rb,
lib/cmdx/retriers/full_random.rb,
lib/cmdx/retriers/half_random.rb,
lib/cmdx/retriers/bounded_random.rb,
lib/cmdx/retriers/decorrelated_jitter.rb
Overview
Registry of named retry/jitter strategies used by ‘Retry` to compute the sleep duration between attempts. Ships with built-ins for `:exponential`, `:half_random`, `:full_random`, `:bounded_random`, `:linear`, `:fibonacci`, and `:decorrelated_jitter`. A retrier is any callable accepting `call(attempt, delay, prev_delay)` that returns the next delay in seconds.
Defined Under Namespace
Modules: BoundedRandom, DecorrelatedJitter, Exponential, Fibonacci, FullRandom, HalfRandom, Linear
Instance Attribute Summary collapse
-
#registry ⇒ Object
readonly
Returns the value of attribute registry.
Instance Method Summary collapse
-
#deregister(name) ⇒ Retriers
Self for chaining.
- #empty? ⇒ Boolean
-
#initialize ⇒ Retriers
constructor
A new instance of Retriers.
- #initialize_copy(source) ⇒ void
-
#key?(name) ⇒ Boolean
Whether a retrier is registered under ‘name`.
-
#lookup(name) ⇒ #call
The registered retrier.
-
#register(name, callable = nil, &block) { ... } ⇒ Retriers
Registers a named retrier, overwriting any existing entry.
-
#resolve(spec) ⇒ #call?
Resolves a ‘:jitter` spec to a concrete callable.
- #size ⇒ Integer
Constructor Details
#initialize ⇒ Retriers
Returns a new instance of Retriers.
13 14 15 16 17 18 19 20 21 22 23 |
# File 'lib/cmdx/retriers.rb', line 13 def initialize @registry = { exponential: Retriers::Exponential, half_random: Retriers::HalfRandom, full_random: Retriers::FullRandom, bounded_random: Retriers::BoundedRandom, linear: Retriers::Linear, fibonacci: Retriers::Fibonacci, decorrelated_jitter: Retriers::DecorrelatedJitter } end |
Instance Attribute Details
#registry ⇒ Object (readonly)
Returns the value of attribute registry.
11 12 13 |
# File 'lib/cmdx/retriers.rb', line 11 def registry @registry end |
Instance Method Details
#deregister(name) ⇒ Retriers
Returns self for chaining.
58 59 60 61 |
# File 'lib/cmdx/retriers.rb', line 58 def deregister(name) registry.delete(name) self end |
#empty? ⇒ Boolean
105 106 107 |
# File 'lib/cmdx/retriers.rb', line 105 def empty? registry.empty? end |
#initialize_copy(source) ⇒ void
This method returns an undefined value.
27 28 29 |
# File 'lib/cmdx/retriers.rb', line 27 def initialize_copy(source) @registry = source.registry.dup end |
#key?(name) ⇒ Boolean
Returns whether a retrier is registered under ‘name`.
65 66 67 |
# File 'lib/cmdx/retriers.rb', line 65 def key?(name) registry.key?(name) end |
#lookup(name) ⇒ #call
Returns the registered retrier.
72 73 74 75 76 77 78 79 |
# File 'lib/cmdx/retriers.rb', line 72 def lookup(name) registry[name] || begin raise UnknownEntryError, <<~MSG.chomp unknown retrier #{name.inspect}; registered: #{registry.keys.inspect}. See https://drexed.github.io/cmdx/retries/#built-in-strategies MSG end end |
#register(name, callable = nil, &block) { ... } ⇒ Retriers
Registers a named retrier, overwriting any existing entry.
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/cmdx/retriers.rb', line 40 def register(name, callable = nil, &block) retrier = callable || block if callable && block raise ArgumentError, "retrier: provide either a callable or a block, not both" elsif !retrier.respond_to?(:call) raise ArgumentError, <<~MSG.chomp retrier must respond to #call (got #{retrier.class}). See https://drexed.github.io/cmdx/retries/#custom-strategies-via-the-retriers-registry MSG end registry[name.to_sym] = retrier self end |
#resolve(spec) ⇒ #call?
Resolves a ‘:jitter` spec to a concrete callable. Accepts a Symbol (registry lookup) or any object responding to `#call`. `nil` resolves to `nil` so callers can fall back to the unjittered base delay.
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
# File 'lib/cmdx/retriers.rb', line 88 def resolve(spec) case spec when NilClass nil when Symbol lookup(spec) else return spec if spec.respond_to?(:call) raise UnknownEntryError, <<~MSG.chomp unknown retrier #{spec.inspect}; expected a Symbol from #{registry.keys.inspect} or a callable. See https://drexed.github.io/cmdx/retries/#built-in-strategies MSG end end |
#size ⇒ Integer
110 111 112 |
# File 'lib/cmdx/retriers.rb', line 110 def size registry.size end |