def start
      @work.each do |item|
        return if @stopping
        begin
          item.decoded_message = options[:payload_handler].decode(item.message)
          item.klass = options[:payload_handler].payload_class(item.decoded_message)
          Chore.run_hooks_for(:worker_to_start, item)
          start_item(item)
        rescue => e
          Chore.logger.error { "Failed to run job for #{item.message} with error: #{e.message} #{e.backtrace * "\n"}" }
          if item.current_attempt >= Chore.config.max_attempts
            Chore.run_hooks_for(:on_permanent_failure,item.queue_name,item.message,e)
            item.consumer.complete(item.id)
          else
            Chore.run_hooks_for(:on_failure,item.message,e)
            item.consumer.reject(item.id)
          end
        end
      end
    end
def start
      @work.each do |item|
        return if @stopping
        begin
          item.decoded_message = options[:payload_handler].decode(item.message)
          item.klass = options[:payload_handler].payload_class(item.decoded_message)
          Chore.run_hooks_for(:worker_to_start, item)
          start_item(item)
        rescue => e
          Chore.logger.error { "Failed to run job for #{item.message} with error: #{e.message} #{e.backtrace * "\n"}" }
          if item.current_attempt >= Chore.config.max_attempts
            Chore.run_hooks_for(:on_permanent_failure,item.queue_name,item.message,e)
            item.consumer.complete(item.id)
          else
            Chore.run_hooks_for(:on_failure,item.message,e)
            item.consumer.reject(item.id)
          end
        end
      end
    end
The workhorse. Do the work, all of it. This will block for an entirely unspecified amount
 of time based on the work to be performed. This will:
 * Decode each message.
 * Re-ify the messages into actual Job classes.
 * Call Job#perform on each job.
 * If successful it will call Consumer#complete (using the consumer in the UnitOfWork).
 * If unsuccessful it will call the appropriate Hooks based on the type of failure.
 * If unsuccessful *and* the maximum number of attempts for the job has been surpassed, it will call
   the permanent failure hooks and Consumer#complete.
 * Log the results via the Chore.logger