Skip to Content Skip to Search

class ActiveJob::Continuation::Step

Active Job Continuation Step

Represents a step within a continuable job.

When a step is completed, it is recorded in the job’s continuation state. If the job is interrupted, it will be resumed from after the last completed step.

Steps also have an optional cursor that can be used to track progress within the step. If a job is interrupted during a step, the cursor will be saved and passed back when the job is resumed.

It is the responsibility of the code in the step to use the cursor correctly to resume from where it left off.

Attributes

[R] cursor

The cursor for the step.

[R] name

The name of the step.

Public class methods

Source code GitHub
# File activejob/lib/active_job/continuation/step.rb, line 25
def initialize(name, cursor, resumed:, &checkpoint_callback)
  @name = name.to_sym
  @initial_cursor = cursor
  @cursor = cursor
  @resumed = resumed
  @checkpoint_callback = checkpoint_callback
end

Public instance methods

Advance the cursor from the current or supplied value

The cursor will be advanced by calling the succ method on the cursor. An UnadvanceableCursorError error will be raised if the cursor does not implement succ.

Source code GitHub
# File activejob/lib/active_job/continuation/step.rb, line 49
def advance!(from: nil)
  from = cursor if from.nil?
  raise UnadvanceableCursorError, "Cursor class '#{from.class}' does not implement succ, " unless from.respond_to?(:succ)
  set! from.succ
end

Has the cursor been advanced during this job execution?

Source code GitHub
# File activejob/lib/active_job/continuation/step.rb, line 61
def advanced?
  initial_cursor != cursor
end

Check if the job should be interrupted, and if so raise an Interrupt exception. The job will be requeued for retry.

Source code GitHub
# File activejob/lib/active_job/continuation/step.rb, line 35
def checkpoint!
  checkpoint_callback.call
end
Source code GitHub
# File activejob/lib/active_job/continuation/step.rb, line 69
def description
  "at '#{name}', cursor '#{cursor.inspect}'"
end

Has this step been resumed from a previous job execution?

Source code GitHub
# File activejob/lib/active_job/continuation/step.rb, line 56
def resumed?
  @resumed
end

Set the cursor and interrupt the job if necessary.

Source code GitHub
# File activejob/lib/active_job/continuation/step.rb, line 40
def set!(cursor)
  @cursor = cursor
  checkpoint!
end
Source code GitHub
# File activejob/lib/active_job/continuation/step.rb, line 65
def to_a
  [ name.to_s, cursor ]
end

Definition files