Module: RocketJob::Plugins::Restart

Extended by:
ActiveSupport::Concern
Included in:
Jobs::DirmonJob
Defined in:
lib/rocket_job/plugins/restart.rb

Overview

Automatically starts a new instance of this job anytime it fails, aborts, or completes.

Notes:

  • Restartable jobs automatically abort if they fail. This prevents the failed job from being retried.

    • To disable this behavior, add the following empty method:

      def rocket_job_restart_abort
      end
      
  • On destroy this job is destroyed without starting a new instance.

  • On Abort a new instance is created.

  • Include ‘RocketJob::Plugins::Singleton` to prevent multiple copies of a job from running at the same time.

  • The job will not be restarted if:

    • A validation fails after creating the new instance of this job.

    • The job has expired.

  • Only the fields that have ‘copy_on_restart: true` will be passed onto the new instance of this job.

Example:

class RestartableJob < RocketJob::Job

include RocketJob::Plugins::Restart

# Retain the completed job under the completed tab in Rocket Job Mission Control.
self.destroy_on_complete = false

# Will be copied to the new job on restart.
field :limit, type: Integer, copy_on_restart: true

# Will _not_ be copied to the new job on restart.
field :list, type: Array, default: [1,2,3]

# Set run_at every time a new instance of the job is created.
after_initialize set_run_at, if: :new_record?

def perform
  puts "The limit is #{limit}"
  puts "The list is #{list}"
  'DONE'
end

private

# Run this job in 30 minutes.
def set_run_at
  self.run_at = 30.minutes.from_now
end

end

job = RestartableJob.create!(limit: 10, list: [4,5,6]) job.reload.state # => :queued

job.limit # => 10

job.list # => [4,5,6]

# Wait 30 minutes …

job.reload.state # => :completed

# A new instance was automatically created. job2 = RestartableJob.last job2.state # => :queued

job2.limit # => 10

job2.list # => [1,2,3]