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