Module: Delayed::Backend::Base

Included in:
Job
Defined in:
lib/delayed/backend/base.rb

Defined Under Namespace

Modules: ClassMethods

Constant Summary collapse

ParseObjectFromYaml =

rubocop:disable Naming/ConstantName

%r{!ruby/\w+:([^\s]+)}

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#errorObject

Returns the value of attribute error.



104
105
106
# File 'lib/delayed/backend/base.rb', line 104

def error
  @error
end

Class Method Details

.included(base) ⇒ Object



4
5
6
# File 'lib/delayed/backend/base.rb', line 4

def self.included(base)
  base.extend ClassMethods
end

Instance Method Details

#destroy_failed_jobs?Boolean

Returns:

  • (Boolean)


203
204
205
206
207
# File 'lib/delayed/backend/base.rb', line 203

def destroy_failed_jobs?
  payload_object.respond_to?(:destroy_failed_jobs?) ? payload_object.destroy_failed_jobs? : Delayed::Worker.destroy_failed_jobs
rescue DeserializationError
  Delayed::Worker.destroy_failed_jobs
end

#fail!Object



209
210
211
212
# File 'lib/delayed/backend/base.rb', line 209

def fail!
  self.failed_at = self.class.db_time_now
  save!
end

#failed?Boolean Also known as: failed

Returns:

  • (Boolean)


111
112
113
# File 'lib/delayed/backend/base.rb', line 111

def failed?
  !!failed_at
end

#hook(name, *args) ⇒ Object



164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
# File 'lib/delayed/backend/base.rb', line 164

def hook(name, *args)
  if payload_object.respond_to?(name)
    if name == :enqueue
      raise ':enqueue hook is no longer supported'
    end

    if payload_object.is_a?(Delayed::JobWrapper)
      warn '[DEPRECATION] Job hook methods (`before`, `after`, `success`, etc) are deprecated. Use ActiveJob callbacks instead.'
    end

    method = payload_object.method(name)
    method.arity.zero? ? method.call : method.call(self, *args)
  end
rescue DeserializationError
end

#invoke_jobObject



145
146
147
148
149
150
151
152
153
154
155
156
# File 'lib/delayed/backend/base.rb', line 145

def invoke_job
  Delayed::Worker.lifecycle.run_callbacks(:invoke_job, self) do
    hook :before
    payload_object.perform
    hook :success
  rescue Exception => e # rubocop:disable Lint/RescueException
    hook :error, e
    raise e
  ensure
    hook :after
  end
end

#max_attemptsObject



188
189
190
# File 'lib/delayed/backend/base.rb', line 188

def max_attempts
  payload_object.max_attempts if payload_object.respond_to?(:max_attempts)
end

#max_run_timeObject



192
193
194
195
196
197
198
199
200
201
# File 'lib/delayed/backend/base.rb', line 192

def max_run_time
  return unless payload_object.respond_to?(:max_run_time)
  return unless (run_time = payload_object.max_run_time)

  if run_time > Delayed::Worker.max_run_time
    Delayed::Worker.max_run_time
  else
    run_time
  end
end

#nameObject



118
119
120
121
122
123
124
# File 'lib/delayed/backend/base.rb', line 118

def name
  if self.class.name_assignable?
    super || display_name
  else
    display_name # [feat:NameColumn] remove fallback once the "name" column is required.
  end
end

#payload_objectObject



139
140
141
142
143
# File 'lib/delayed/backend/base.rb', line 139

def payload_object
  @payload_object ||= YAML.load_dj(handler)
rescue TypeError, LoadError, NameError, ArgumentError, SyntaxError, Psych::SyntaxError => e
  raise DeserializationError, "Job failed to load: #{e.message}. Handler: #{handler.inspect}"
end

#payload_object=(object) ⇒ Object



134
135
136
137
# File 'lib/delayed/backend/base.rb', line 134

def payload_object=(object)
  @payload_object = object
  self.handler = YAML.dump_dj(object)
end

#priorityObject



126
127
128
# File 'lib/delayed/backend/base.rb', line 126

def priority
  Priority.new(super)
end

#priority=(value) ⇒ Object



130
131
132
# File 'lib/delayed/backend/base.rb', line 130

def priority=(value)
  super(Priority.new(value))
end

#reschedule_atObject



180
181
182
183
184
185
186
# File 'lib/delayed/backend/base.rb', line 180

def reschedule_at
  if payload_object.respond_to?(:reschedule_at)
    payload_object.reschedule_at(self.class.db_time_now, attempts)
  else
    self.class.db_time_now + (attempts**4) + 5
  end
end

#unlockObject

Unlock this job (note: not saved to DB)



159
160
161
162
# File 'lib/delayed/backend/base.rb', line 159

def unlock
  self.locked_at    = nil
  self.locked_by    = nil
end