Class: RotatePhoneQueuesWorker

Inherits:
Object
  • Object
show all
Includes:
Sidekiq::Job
Defined in:
app/workers/rotate_phone_queues_worker.rb

Overview

Sidekiq worker: rotate phone queues.

Applies each due PhoneQueueRotation rule to its queue's ring order on the
PBX (In Order queues ring members in sequence, so without rotation the same
agent always takes the first call). Runs once a day from the sidekiq
schedule.

Replay safety: Sidekiq is at-least-once, so the rule is CLAIMED (atomic
last_rotated_at stamp) before the PBX write, not after — overlapping or
retried runs find the rule already claimed and rotate zero times, and a
crash after the claim skips today rather than double-rotating. The claim is
released only when the run provably never wrote (getQueueInfo failed);
refused or unverifiable writes keep it, because re-rotating an order that
may already have changed is worse than retrying tomorrow.

Defined Under Namespace

Classes: TransientPbxError

Instance Method Summary collapse

Instance Method Details

#performObject

Runs the job.

Returns:

  • (Object)

    the result

Raises:



34
35
36
37
38
39
40
# File 'app/workers/rotate_phone_queues_worker.rb', line 34

def perform
  transient_failures = 0
  PhoneQueueRotation.due_today.find_each do |rule|
    transient_failures += 1 if rotate(rule) == :transient_failure
  end
  raise TransientPbxError, "getQueueInfo failed for #{transient_failures} queue(s)" if transient_failures.positive?
end