Limitando fila no asterisk sem usar maxlen

Limitando uma fila no Asterisk

Certa feita foi solicitado por um cliente que a sua fila de atendimento fosse limitada a um número máximo específico de pessoas aguardando. Pensei: fácil, usando o parâmetro “maxlen” no arquivo queues.conf posso limitar o tamanho máximo da fila.

Até ai tudo bem. Porém esse artifício é utilizado pelo asterisk somente após o chamador ser direcionado para a fila através do comando Queue() e isso leva, por exemplo, a um inconveniente que é dar um tom de ocupado no ouvido do chamador logo após ouvir a mensagem de boas vindas, caso a fila esteja no limite, sem avisá-lo o que está acontecendo e outras limitações, apesar de ser uma mão na roda.

Buscando uma alternativa para isso, pois tínhamos uma exigência a mais, chegamos a algumas conclusões porém optamos pela situação abaixo que deixamos documentada para caso você também tenha essa necessidade um dia.

A lógica por trás do código

Precisamos testar o tamanho da fila e, caso a fila esteja no limite, direcionar para uma mensagem e informar  que estamos com todos os atendentes ocupados e só então desligá-lo ou, caso o limite da fila não tenha sido atingido, direcionar o usuário para a fila de atendimento porém antes executando um áudio identificando o cliente.

O segredo para isto está em uma variável de ambiente do Asterisk que informa quantos usuários estão aguardando na fila naquele momento. A variável é: ${QUEUE_WAITING_COUNT(nome_fila)}.

De posse do retorno dessa variável, utilizamos o comando GotoIf para direcionar a chamada de acordo com o resultado.

Vamos ao trecho que deve ser inserido no seu extensions.conf e vamos considerar que queiramos uma fila com no máximo 5 usuários aguardando atendimento:

;; Testa tamanho da fila. Se fila < 6 direciona para MSG_FILA_CHEIA
exten =>1234,1,Answer()
same => n,GotoIf($[“${QUEUE_WAITING_COUNT(nome_fila)}” < “6”]?enfilera:descarta)
same => n(enfilera),NoOp(“Enfileirando chamada”)
same => n,Playback(MSG_BOAS_VINDAS)
same => n,queue(nome_fila,htT)
same => n,Goto(end)
same => n(descarta),NoOp(“Descartando chamada”)
same => n,Playback(MSG_FILA_CHEIA)
same => n(end),Busy(3)
same => n,Hangup()

Note que o trecho acima utilizamos a extensão same que é um excelente recurso do Asterisk. Se ainda não conhece essa extensão, leia o nosso artigo “Same: uma mão na roda no extensions.conf”.

Caso tenha ficado alguma dúvida sobre o trecho em sí ou mesmo sobre o uso de algum dos comandos utilizados neste trecho de contexto, não hesite em deixar seu comentário ou envie um e-mail que responderei com a máxima brevidade.

That’s All.

Deixe uma resposta