class Restforce::DB::TaskManager
Restforce::DB::TaskManager
defines the run sequence and invocation of each of the Restforce::DB::Task
subclasses during a single processing loop for the top-level Worker
object.
Public Class Methods
Public: Initialize a new Restforce::DB::TaskManager
for a given runner state.
runner - A Restforce::DB::Runner
for a specific period of time. logger - A Logger object (optional).
# File lib/restforce/db/task_manager.rb, line 32 def initialize(runner, logger: nil) @runner = runner @logger = logger @changes = Hash.new { |h, k| h[k] = Accumulator.new } end
Public Instance Methods
Public: Run each of the sync tasks in a defined order for the supplied runner’s current state.
Returns nothing.
# File lib/restforce/db/task_manager.rb, line 42 def perform Registry.each do |mapping| run("CLEANING RECORDS", Cleaner, mapping) run("ATTACHING RECORDS", Attacher, mapping) run("PROPAGATING RECORDS", Initializer, mapping) run("COLLECTING CHANGES", Collector, mapping) end # NOTE: We can only perform the synchronization after all record changes # have been aggregated, so this second loop is necessary. Registry.each do |mapping| run("UPDATING ASSOCIATIONS", Associator, mapping) run("APPLYING CHANGES", Synchronizer, mapping) end end
Private Instance Methods
Internal: Log a description and response time for a specific named task.
NOTE: AuthenticationErrors from Restforce’s middleware seem to be linked to thread-safety issues, so we want to error out the entire processing loop in the event that we run into one of these. This is the reason for the fairly convoluted ‘rescue` chain below.
name - A String task name. task_class - A Restforce::DB::Task
subclass. mapping - A Restforce::DB::Mapping
.
Returns a Boolean.
# File lib/restforce/db/task_manager.rb, line 72 def run(name, task_class, mapping) log " #{name} between #{mapping.database_model.name} and #{mapping.salesforce_model}" runtime = Benchmark.realtime { task task_class, mapping } log format(" FINISHED #{name} after %.4f", runtime) true rescue Restforce::AuthenticationError => e log e, :warn raise e rescue => e error(e) false rescue Exception => e # rubocop:disable Lint/RescueException error(e) raise e end
Internal: Run the passed mapping through the supplied Task
class.
task_class - A Restforce::DB::Task
subclass. mapping - A Restforce::DB::Mapping
.
Returns nothing.
# File lib/restforce/db/task_manager.rb, line 95 def task(task_class, mapping) task_class.new(mapping, @runner).run(@changes) rescue Faraday::Error::ClientError => e task_mapping = TaskMapping.new(task_class, mapping) error SynchronizationError.new(e, task_mapping) end