Class: Amigo::Retry::ServerMiddleware

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

Instance Method Summary collapse

Instance Method Details

#amigo_retry_in(job_class, item, interval) ⇒ Object



147
148
149
150
151
152
153
154
155
# File 'lib/amigo/retry.rb', line 147

def amigo_retry_in(job_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
  job_class.client_push(item)
end

#call(worker, job, _queue) ⇒ Object



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

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



123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/amigo/retry.rb', line 123

def handle_die(worker, job, e)
  if e.respond_to?(:on_die)
    callback_result = e.on_die(worker, job)
    if callback_result == :skip
      Sidekiq.logger.warn("skipping_deadset_send")
      return
    end
  end
  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



109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'lib/amigo/retry.rb', line 109

def handle_retry(worker, job, e)
  if e.respond_to?(:on_retry)
    callback_result = e.on_retry(worker, job)
    if callback_result == :skip
      Sidekiq.logger.warn("skipping_retryset_schedule")
      return
    end
  end
  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



138
139
140
141
142
143
144
145
# File 'lib/amigo/retry.rb', line 138

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