Class: Amigo::Retry::ServerMiddleware

Inherits:
Object
  • Object
show all
Defined in:
lib/amigo/retry.rb

Instance Method Summary collapse

Instance Method Details

#amigo_retry_in(worker_class, item, interval) ⇒ Object



99
100
101
102
103
104
105
106
107
# File 'lib/amigo/retry.rb', line 99

def amigo_retry_in(worker_class, item, interval)
  # pulled from perform_in
  int = interval.to_f
  now = Time.now.to_f
  ts = (int < 1_000_000_000 ? now + int : int)
  item["at"] = ts if ts > now
  item["retry_count"] = item.fetch("retry_count", 0) + 1
  worker_class.client_push(item)
end

#call(worker, job, _queue) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/amigo/retry.rb', line 62

def call(worker, job, _queue)
  yield
rescue Amigo::Retry::Retry => e
  handle_retry(worker, job, e)
rescue Amigo::Retry::Die => e
  handle_die(worker, job, e)
rescue Amigo::Retry::OrDie => e
  handle_retry_or_die(worker, job, e)
rescue Amigo::Retry::Quit
  Sidekiq.logger.info("job_quit")
  return
end

#handle_die(_worker, job, e) ⇒ Object



82
83
84
85
86
87
88
# File 'lib/amigo/retry.rb', line 82

def handle_die(_worker, job, e)
  Sidekiq.logger.warn("sending_to_deadset")
  job["error_class"] = e.class.to_s
  job["error_message"] = e.to_s
  payload = Sidekiq.dump_json(job)
  Sidekiq::DeadSet.new.kill(payload, notify_failure: false)
end

#handle_retry(worker, job, e) ⇒ Object



75
76
77
78
79
80
# File 'lib/amigo/retry.rb', line 75

def handle_retry(worker, job, e)
  Sidekiq.logger.info("scheduling_retry")
  job["error_class"] = e.class.to_s
  job["error_message"] = e.to_s
  self.amigo_retry_in(worker.class, job, e.interval_or_timestamp)
end

#handle_retry_or_die(worker, job, e) ⇒ Object



90
91
92
93
94
95
96
97
# File 'lib/amigo/retry.rb', line 90

def handle_retry_or_die(worker, job, e)
  retry_count = job.fetch("retry_count", 0)
  if retry_count <= e.attempts
    handle_retry(worker, job, e)
  else
    handle_die(worker, job, e)
  end
end