class PubSubModelSync::Transaction

Constants

PUBLISHER_KLASS

Attributes

children[RW]
finished[RW]
key[RW]
max_buffer[RW]
payloads[RW]
root[RW]

Public Class Methods

new(key, max_buffer: config.transactions_max_buffer) click to toggle source

@param key (String,Null) Transaction key, if empty will use the ordering_key from first payload @param max_buffer (Integer) Once this quantity of notifications is reached, then all notifications

will immediately be delivered.
Note: There is no way to rollback delivered notifications if current transaction fails
# File lib/pub_sub_model_sync/transaction.rb, line 12
def initialize(key, max_buffer: config.transactions_max_buffer)
  @key = key
  @max_buffer = max_buffer
  @children = []
  @payloads = []
end

Public Instance Methods

add_payload(payload) click to toggle source

@param payload (Payload)

# File lib/pub_sub_model_sync/transaction.rb, line 20
def add_payload(payload)
  payloads << payload
  log("Payload added to current transaction: #{payload.inspect}") if config.debug
  return unless payloads.count >= max_buffer

  log("Payloads buffer was filled, delivering current payloads: #{payloads.count}")
  deliver_payloads
end
add_transaction(transaction) click to toggle source
# File lib/pub_sub_model_sync/transaction.rb, line 38
def add_transaction(transaction)
  transaction.root = self
  children << transaction
  transaction
end
clean_publisher() click to toggle source
# File lib/pub_sub_model_sync/transaction.rb, line 51
def clean_publisher
  PUBLISHER_KLASS.current_transaction = nil if !root && children.empty?
end
deliver_all() click to toggle source
# File lib/pub_sub_model_sync/transaction.rb, line 55
def deliver_all
  deliver_payloads
  clean_publisher
end
finish() click to toggle source
# File lib/pub_sub_model_sync/transaction.rb, line 29
def finish # rubocop:disable Metrics/AbcSize
  if root
    root.children = root.children.reject { |t| t == self }
    root.deliver_all if root.finished && root.children.empty?
  end
  self.finished = true
  deliver_all if children.empty?
end
rollback() click to toggle source
# File lib/pub_sub_model_sync/transaction.rb, line 44
def rollback
  log("Rollback #{payloads.count} notifications", :warn) if children.any? && debug?
  self.children = []
  root&.rollback
  clean_publisher
end

Private Instance Methods

deliver_payloads() click to toggle source
# File lib/pub_sub_model_sync/transaction.rb, line 62
def deliver_payloads
  payloads.each do |payload|
    begin # rubocop:disable Style/RedundantBegin (ruby 2.4 support)
      PUBLISHER_KLASS.connector_publish(payload)
    rescue => e
      PUBLISHER_KLASS.send(:notify_error, e, payload)
    end
  end
  self.payloads = []
end