Class: JobWorkflow::TaskRetry

Inherits:
Object
  • Object
show all
Defined in:
lib/job_workflow/task_retry.rb,
sig/generated/job_workflow/task_retry.rbs

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(count: 0, strategy: :exponential, base_delay: 1, jitter: false) ⇒ TaskRetry

: (?count: Integer, ?strategy: Symbol, ?base_delay: Integer, ?jitter: bool) -> void

Parameters:

  • count: (Integer) (defaults to: 0)
  • strategy: (Symbol) (defaults to: :exponential)
  • base_delay: (Integer) (defaults to: 1)
  • jitter: (Boolean) (defaults to: false)


30
31
32
33
34
35
# File 'lib/job_workflow/task_retry.rb', line 30

def initialize(count: 0, strategy: :exponential, base_delay: 1, jitter: false)
  @count = count
  @strategy = strategy
  @base_delay = base_delay
  @jitter = jitter
end

Instance Attribute Details

#base_delayInteger (readonly)

Signature:

  • Integer

Returns:

  • (Integer)


7
8
9
# File 'lib/job_workflow/task_retry.rb', line 7

def base_delay
  @base_delay
end

#countInteger (readonly)

Signature:

  • Integer

Returns:

  • (Integer)


5
6
7
# File 'lib/job_workflow/task_retry.rb', line 5

def count
  @count
end

#jitterBoolean (readonly)

Signature:

  • bool

Returns:

  • (Boolean)


8
9
10
# File 'lib/job_workflow/task_retry.rb', line 8

def jitter
  @jitter
end

#strategySymbol (readonly)

Signature:

  • Symbol

Returns:

  • (Symbol)


6
7
8
# File 'lib/job_workflow/task_retry.rb', line 6

def strategy
  @strategy
end

Class Method Details

.from_primitive_value(value) ⇒ TaskRetry

: (Integer | Hash[Symbol, untyped]) -> TaskRetry

Parameters:

  • (Integer, Hash[Symbol, untyped])

Returns:



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/job_workflow/task_retry.rb', line 12

def from_primitive_value(value)
  case value
  when Integer
    new(count: value)
  when Hash
    new(
      count: value.fetch(:count, 3),
      strategy: value.fetch(:strategy, :exponential),
      base_delay: value.fetch(:base_delay, 1),
      jitter: value.fetch(:jitter, false)
    )
  else
    raise ArgumentError, "retry must be Integer or Hash"
  end
end

Instance Method Details

#apply_jitter(delay) ⇒ Float

: (Integer) -> Float

Parameters:

  • (Integer)

Returns:

  • (Float)


57
58
59
60
61
62
# File 'lib/job_workflow/task_retry.rb', line 57

def apply_jitter(delay)
  return delay.to_f unless jitter

  randomness = delay * 0.5
  delay + (rand * randomness) - (randomness / 2)
end

#calculate_base_delay(retry_attempt) ⇒ Integer

: (Integer) -> Integer

Parameters:

  • (Integer)

Returns:

  • (Integer)


46
47
48
49
50
51
52
53
54
# File 'lib/job_workflow/task_retry.rb', line 46

def calculate_base_delay(retry_attempt)
  case strategy
  when :exponential
    exponent = retry_attempt - 1 #: Integer
    base_delay * (1 << exponent)
  else
    base_delay
  end
end

#delay_for(retry_attempt) ⇒ Float

: (Integer) -> Float

Parameters:

  • (Integer)

Returns:

  • (Float)


38
39
40
41
# File 'lib/job_workflow/task_retry.rb', line 38

def delay_for(retry_attempt)
  delay = calculate_base_delay(retry_attempt)
  apply_jitter(delay)
end