Команда Queue()


Назначение:

Постановка вызова в очередь звонков

Описание:

В Asterisk версии 1.0, 1.2:
Queue(queuename[|options[|URL][|announceoverride][|timeout])

В Asterisk версии 1.4:
Queue(queuename[|options[|URL][|announceoverride][|timeout][|AGI])

Постановка входящего вызова в соотв. "очередь вызовов", как определено в файле queues.conf или в механизме realtime для очередей вызовов ..

Строка с опциями может быть пустой или содержать следующие символы:
  • d — data-quality (модемный) вызов (с минимальными задержками).
  • h — дает возможность вызывающему абоненту "положить трубку", нажатием кнопки звездочки (*).
  • H — дает возможность звонящему абоненту "положить трубку", нажатием кнопки звездочки (*).
  • n — не делать повторных попыток вызовов агентов или екстеншенов в данной очереди при возникновении таймаута; будет совершен выход из приложения очереди и совершен переход к следующему приоритету в плане набора.
  • r — вместо звучания музыки (MOH) вызывающий абонент будет слышать гудки, как при звонке (ringing)
  • t — дать возможность вызываемому абоненту сделать перевод звонка на другой номер
  • T — дать возможность звонящему (вызывающему) абоненту совершать перевод звонка на другой номер.
  • w — дать возможность вызываемому абоненту записать разговор на диск, с помощью приложения Monitor.
  • W — дать возможность звонящему (вызывающему) абоненту записать разговор на диск, с помощью приложения Monitor.


В дополнение к переводу звонка на другой номер, с вызовом может быть совершена парковка и тогда он может быть обработан (picked up) другим пользователем.

Параметр 'URL' позволяет Вам указать URL, который будет передан вызываемому абоненту в случае, если канал поддерживает эту возможность. Так же Вы можете использовать внешние приложения, типа: QueueMetrics или Asteria Solutions AgentClient для открытия указанного URL, если ваш терминал не поддерживает эту возможность.

  • Начиная с Asterisk версии 1.4, в необязательном параметре 'AGI', может быть задано имя AGI скрипта, который будет выполнен только один раз для канала вызывающего абонента, когда его вызов будет соединен с одним из участником, который обрабатывает очередь вызовов.

параметр announceoverride - позволяет вам переопределить приветствие (announcement), которое определено в файле queues.conf с помощью директивы 'announce = ...' или позволяет добавить еще одно приветствие, которое будет проиграно первым.

параметр timeout - устанавливает время в секундах, в течении которого вызов будет ожидать обработки в заданной очереди, перед тем, как передать управление следующей по приоритету команде в плане набора. Значение по умолчанию - 300 секунд (5 минут).

timeout заставляет команду queue аварийно завершиться по истечении заданого количества секунд, проверяется между значениями параметров файла конфигурации queues.conf 'timeout' и 'retry'.

Замечание: Этот timeout работает совсем не так, как подумал бы нормальный человек (в версии 1.2.4 точно не так). При попадании вызова в очередь, состояние таймаута, по заданному в качестве аргумента функции параметру, определяется с частотой, которая зависит от значения параметра 'timeout=' в фале конфигурации queues.conf для данной очереди. Это означает, что если в файле queues.conf установлено 'timeout=10' и вызов попадает в очередь как: 'Queue(queuename,,,5)', то он будет находиться в очереди на протяжении десяти секунд до того, как команда queue закончит свое выполнение по таймауту. Если же Вы помещаете вызов в очередь командой: 'Queue(queuename,,,11)', то он будет находиться в очереди не протяжении максимум 20 секунд. Т.е. параметр команды 'timeout' НЕ ПЕРЕОПРЕДЕЛЯЕТ значение параметра 'timeout=' в файле конфигурации queues.conf. Однако, не стоит даже думать о том, чтобы изменить значение параметра 'timeout=' в файле queues.conf, скажем, на 1, т.к. в этом случае участники обрабатывающие очередь будут каждый раз вызываться только в течении одной секунды.

В этой статье делается попытка объяснить это поведение. Стоит отметить, что в этой статье указывается на то, что поведение параметра 'timeout' является неправильным.

Замечание: Поведение параметра 'timeout' так же рассматривалось в Asterisk версии 1.4. По этому поводу можно почитать в bug треккере тут.



Это приложение устанавливает следующие переменные канала по завершению своей работы:

  • QUEUESTATUS - Статус вызова попавшего в очередь в виде текстовой строки, возможные значения:
    • TIMEOUT
    • FULL
    • JOINEMPTY
    • LEAVEEMPTY
    • JOINUNAVAIL
    • LEAVEUNAVAIL
  • MEMBERINTERFACE Новая переменная канала, начиная с Asterisk версии 1.4. Эта переменная содержит информацию о том участнике обработки очереди, который принял поступивший вызов. Переменная будет доступна только в том случае, если в файле конфигурации queues.conf Вы установите параметр 'setinterfacevar=' в значение 'yes'.


Коды возврата

Это приложение вернет -1, если вызываемый канал отключился (положил трубку) или, если вызов соединен и любая из соединенных сторон заканчивает вызов.Возвращает 0, если очередь заполнена, не существует или в ней нет ни одного участника, который мог бы обработать вызов.

Данный метод работает только в том случае, когда нет "обработчиков очереди звонков", определенных в фале queues.conf, и вместо этого они добавляются только командой AddQueueMember().
Однако, если в файле queues.conf есть строка "Member => Agent/101", выход из команды Queue всегда будет таким, как будто в очереди есть "обработчики очереди звонков", которые могут обработать вызов помещенный в очередь.
Update: 'leavewhenempty = yes' в файле queues.conf решает данную проблему (CVS since Sep 28, 2004)

Примечания

  • Агенты, добавленные динамически, будут утеряны при перезагрузке Asterisk.
  • Если Вы хотите добавлять отдаленных агентов, используя AgentCallbackLogin() , используйте конструкцию для канала, типа 'local' в плане набора, для описания соответствующего dial-out екстеншена.
  • Перевод вызовов на другой номер, для вызовов, которые были приняты из очереди, Asterisk осуществляет при помощи кнопки '#' (transfer) (данная возможность включается, при задании опции 't', описанной выше). Результат перевода звонка SIP присоединяется и сохраняется в состоянии Агента до его возможного актуального завершения (т.е. до того момента, как он реально переведет), что препятствует тому, что Агенту будет послан другой запрос из очереди звонков, до того как обработка предыдущего будет полностью закончена.
  • Участник назначенный на обработку вызовов из очереди (например, "member => Agent/1234") может быть просто определен как оконечное устройство (например: "member => SIP/phone1").
  • Проверяйте настройки таймаутов для всех екстеншенов, которые вовлечены в процесс обработки вызовов из очередей.


Примеры


exten => s,1,Answer
exten => s,2,SetMusicOnHold(default)
exten => s,3,DigitTimeout?,5
exten => s,4,ResponseTimeout,10
exten => s,5,Background(welcome)
exten => s,6,Queue(tech-queue)

Строка: s,1,Answer - важна в том плане, что для проигрывания музыки ожидающему клиенту, сначала нужно ответить на вызов.

Ниже приводятся рабочие примеры решений на базе очередей вызовов:

Вызов, поступающий через sip канал, маршрутизируется на номер экстеншена, который содержит набор правил для обработки демонстрационной очереди звонков (здесь используется экстеншен с номером 129), он находится в контексте example-queue в файле extensions.conf. Вызов, если его не принял агент, должен находится в очереди в течении 300 секунд до того, как он будет маршрутизирован с помощью следующей по приоритету командой в голосовой почтовый ящик.
Вызывающий с вызываемый абонент имеют возможность перевода звонка на другой номер (опции: tT в команде queue в файле extensions.conf).

Сигнализация о звонке агентам, которые обрабатывают очередь, должна выглядеть так:

После того как проиграется первое приветствие "Playback(some_announce)", должны вызваться все агенты (ringall в файле queues.conf) в течении 15 секунд (timeout в файле queues.conf). Тем временем, вызывающий абонент , в течении этого времени должен слушать фоновую музыку. Если в течении этого времени вызов не принят ни одним агентом, тогда, через некоторое время вызов агентов повторяется снова (retry в файле queues.conf). Текущая позиция в очереди сообщается звонящему каждые 30 секунд (announce-frequency и announce-holdtime в файле queues.conf).

extensions.conf:

[queue]

exten => 129,1,Playback(some_announce) ; Важно, смотри примечания
exten => 129,2,Queue(example_queue|tT|||300) ; не устанавливайте опцию n, если это реально не нужно
exten => 129,3,Playback(some_announce_after_leaving_queue)
exten => 129,4,Voicemail(s1234)

queues.conf:

[example_queue]
music = default
strategy = ringall
context = queue-out ; Контент, который будет использован, если звонящий нажал какую-либо цифровую кнопку, пока находится в очереди
timeout = 15
wrapuptime=10
announce-frequency = 30
announce-holdtime = yes
joinempty = yes
member => Agent/1234
member => Agent/1235

agents.conf:

[agents]
ackcall=no ; Агент не должен нажимать # для ответа на звонок
musiconhold => default
agent => 1234,0000,Agent1_Name
agent => 1235,0000, Agent2_Name

Примечания

Проверьте настройки таймаутов Ваших екстеншенов, которые включены в обработку очереди.
Snom Phones имеют в своем web-интерфейса таймаут "invisible" равный 60 секундам.
Команда Playback , даже если воспроизводится пустой файл, помогает уйти от ситуации, когда вызов будет сброшен через 60 секунд.

См. также: