module RocketJob::Plugins::Job::Worker

Public Instance Methods

fail_on_exception!(re_raise_exceptions = false, &block) click to toggle source

Fail this job in the event of an exception.

The job is automatically saved only if an exception is raised in the supplied block.

re_raise_exceptions: [true|false]

Re-raise the exception after updating the job
Default: false
# File lib/rocket_job/plugins/job/worker.rb, line 69
def fail_on_exception!(re_raise_exceptions = false, &block)
  SemanticLogger.named_tagged(job: id.to_s, &block)
rescue Exception => e
  SemanticLogger.named_tagged(job: id.to_s) do
    if failed? || !may_fail?
      self.exception        = JobException.from_exception(e)
      exception.worker_name = worker_name
    else
      fail(worker_name, e)
    end

    # Prevent validation failures from failing the job
    save(validate: false) unless new_record? || destroyed?

    raise e if re_raise_exceptions
  end
end
perform(*) click to toggle source
# File lib/rocket_job/plugins/job/worker.rb, line 58
def perform(*)
  raise NotImplementedError
end
perform_now() click to toggle source

Runs the job now in the current thread.

Validations are called prior to running the job.

The job is not saved and therefore the following callbacks are not called:

  • before_save

  • after_save

  • before_create

  • after_create

Exceptions are not suppressed and should be handled by the caller.

# File lib/rocket_job/plugins/job/worker.rb, line 48
def perform_now
  raise(::Mongoid::Errors::Validations, self) unless valid?

  worker = RocketJob::Worker.new
  start if may_start?
  # Re-Raise exceptions
  rocket_job_work(worker, true) if running?
  @rocket_job_output
end
rocket_job_work(_worker, re_raise_exceptions = false) click to toggle source

Works on this job

Returns [true|false] whether any work was performed.

If an exception is thrown the job is marked as failed and the exception is set in the job itself.

Thread-safe, can be called by multiple threads at the same time

# File lib/rocket_job/plugins/job/worker.rb, line 95
def rocket_job_work(_worker, re_raise_exceptions = false)
  raise(ArgumentError, "Job must be started before calling #rocket_job_work") unless running?

  fail_on_exception!(re_raise_exceptions) do
    if _perform_callbacks.empty?
      @rocket_job_output = perform
    else
      # Allows @rocket_job_output to be modified by after/around callbacks
      run_callbacks(:perform) do
        # Allow callbacks to fail, complete or abort the job
        @rocket_job_output = perform if running?
      end
    end

    if new_record? || destroyed?
      complete if may_complete?
    else
      may_complete? ? complete! : save!
    end
  end
  false
end