Sha256: de31471db7fb3c584d2d73ffbb9768cceb6de8dc5514e9da81471e8d4b3308b7

Contents?: true

Size: 1.99 KB

Versions: 2

Compression:

Stored size: 1.99 KB

Contents

# encoding: UTF-8
require 'active_support/concern'

module RocketJob
  module Plugins
    # Automatically starts a new instance of this job anytime it fails, aborts, or completes.
    # Failed jobs are aborted so that they cannot be restarted.
    # On destroy this job is destroyed without starting a new copy. Abort the job first to get
    # it to start a new instance before destroying.
    # Include RocketJob::Plugins::Singleton to prevent multiple copies of a job from running at
    # the same time.
    #
    # Note:
    # - The job will not be restarted if:
    #   - A validation fails after cloning this job.
    #   - The job has expired.
    module Restart
      extend ActiveSupport::Concern

      included do
        # Attributes to exclude when copying across the attributes to the new instance
        class_attribute :rocket_job_restart_excludes
        self.rocket_job_restart_excludes = %w(_id state created_at started_at completed_at failure_count worker_name percent_complete exception result run_at record_count sub_state)

        after_abort :rocket_job_restart_new_instance
        after_complete :rocket_job_restart_new_instance
        after_fail :rocket_job_restart_abort
      end

      private

      # Run again in the future, even if this run fails with an exception
      def rocket_job_restart_new_instance
        return if expired?
        attrs = attributes.dup
        rocket_job_restart_excludes.each { |attr| attrs.delete(attr) }

        # Copy across run_at for future dated jobs
        attrs['run_at'] = run_at if run_at && (run_at > Time.now)
        # Allow Singleton to prevent the creation of a new job if one is already running
        job             = self.class.create(attrs)
        if job.persisted?
          logger.info("Started a new job instance: #{job.id}")
        else
          logger.info('New job instance not started since one is already active')
        end
      end

      def rocket_job_restart_abort
        new_record? ? abort : abort!
      end

    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
rocketjob-3.0.0.alpha lib/rocket_job/plugins/restart.rb
rocketjob-2.1.3 lib/rocket_job/plugins/restart.rb