Sha256: f46ca9873f420e7303c769b37f347cab02b0a04b040b2cd7eea8fb7ad7ac818c

Contents?: true

Size: 1.72 KB

Versions: 4

Compression:

Stored size: 1.72 KB

Contents

require 'active_support/concern'

module RocketJob
  module Plugins
    module Job
      # Throttle the number of jobs of a specific class that are processed at the same time.
      #
      # Example:
      #   class MyJob < RocketJob
      #     # Maximum number of jobs of this class to process at the same time.
      #     self.throttle_running_jobs = 25
      #
      #     def perform
      #       # ....
      #     end
      #   end
      #
      # Notes:
      # - The number of running jobs will not exceed this value.
      # - It may appear that a job is running briefly over this limit, but then is immediately back into queued state.
      #   This is expected behavior and is part of the check to ensure this value is not exceeded.
      #   The worker grabs the job and only then verifies the throttle, this is to prevent any other worker
      #   from attempting to grab the job, which would have exceeded the throttle.
      module ThrottleRunningJobs
        extend ActiveSupport::Concern

        included do
          # Limit number of jobs running of this class.
          class_attribute :throttle_running_jobs
          self.throttle_running_jobs = nil

          define_throttle :throttle_running_jobs_exceeded?
        end

        private

        # Returns [Boolean] whether the throttle for this job has been exceeded
        def throttle_running_jobs_exceeded?
          return unless throttle_running_jobs&.positive?

          # Cannot use this class since it will include instances of parent job classes.
          RocketJob::Job.with(read: {mode: :primary}) do |conn|
            conn.running.where('_type' => self.class.name, :id.ne => id).count >= throttle_running_jobs
          end
        end
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
rocketjob-5.1.1 lib/rocket_job/plugins/job/throttle_running_jobs.rb
rocketjob-5.1.0 lib/rocket_job/plugins/job/throttle_running_jobs.rb
rocketjob-5.0.0 lib/rocket_job/plugins/job/throttle_running_jobs.rb
rocketjob-5.0.0.rc1 lib/rocket_job/plugins/job/throttle_running_jobs.rb