Sha256: 58b0b81597a3317ba3d684f5ede42d2e187c234178bf6f81793057c87cd56d7f

Contents?: true

Size: 1.99 KB

Versions: 14

Compression:

Stored size: 1.99 KB

Contents

# frozen_string_literal: true

require 'active_support/core_ext/module/attribute_accessors_per_thread'

module GoodJob
  class Adapter
    # The InlineBuffer is integrated into the Adapter and captures jobs that have been enqueued inline.
    # The purpose is allow job records to be persisted, in a locked state, while within a transaction,
    # and then execute the jobs after the transaction has been committed to ensure that the jobs
    # do not run within a transaction.
    #
    # @private This is intended for internal GoodJob usage only.
    class InlineBuffer
      # @!attribute [rw] current_buffer
      #   @!scope class
      #   Current buffer of jobs to be enqueued.
      #   @return [GoodJob::Adapter::InlineBuffer, nil]
      thread_mattr_accessor :current_buffer

      # This block should be used to wrap the transaction that could enqueue jobs.
      # @yield The block that may enqueue jobs.
      # @return [Proc] A proc that will execute enqueued jobs after the transaction has been committed.
      # @example Wrapping a transaction
      #   buffer = GoodJob::Adapter::InlineBuffer.capture do
      #     ActiveRecord::Base.transaction do
      #       MyJob.perform_later
      #     end
      #   end
      #   buffer.call
      def self.capture
        if current_buffer
          yield
          return proc {}
        end

        begin
          self.current_buffer = new
          yield
          current_buffer.to_proc
        ensure
          self.current_buffer = nil
        end
      end

      # Used within the adapter to wrap inline job execution
      def self.perform_now_or_defer(&block)
        if defer?
          current_buffer.defer(block)
        else
          yield
        end
      end

      def self.defer?
        current_buffer.present?
      end

      def initialize
        @callables = []
      end

      def defer(callable)
        @callables << callable
      end

      def to_proc
        proc do
          @callables.map(&:call)
        end
      end
    end
  end
end

Version data entries

14 entries across 14 versions & 1 rubygems

Version Path
good_job-4.8.2 lib/good_job/adapter/inline_buffer.rb
good_job-4.8.1 lib/good_job/adapter/inline_buffer.rb
good_job-4.8.0 lib/good_job/adapter/inline_buffer.rb
good_job-4.7.0 lib/good_job/adapter/inline_buffer.rb
good_job-4.6.0 lib/good_job/adapter/inline_buffer.rb
good_job-4.5.1 lib/good_job/adapter/inline_buffer.rb
good_job-4.5.0 lib/good_job/adapter/inline_buffer.rb
good_job-4.4.2 lib/good_job/adapter/inline_buffer.rb
good_job-4.4.1 lib/good_job/adapter/inline_buffer.rb
good_job-4.4.0 lib/good_job/adapter/inline_buffer.rb
good_job-4.3.0 lib/good_job/adapter/inline_buffer.rb
good_job-4.2.1 lib/good_job/adapter/inline_buffer.rb
good_job-4.2.0 lib/good_job/adapter/inline_buffer.rb
good_job-4.1.1 lib/good_job/adapter/inline_buffer.rb