[asterisk-users] Queue autopause

Miguel Molina mmolina at millenium.com.co
Thu Jul 9 09:41:17 CDT 2009


Christian Gansberger escribió:
> On Thu, Jul 9, 2009 at 12:21 AM, Miguel Molina<mmolina at millenium.com.co> wrote:
>   
>> Christian Gansberger escribió:
>>     
>>> Hi all!
>>>
>>> I want to autopause my queue member when they are not answering within
>>> 20 seconds, and the autopause
>>> should affect all queues they are member of, not only the queue where
>>> the call was not answered.
>>>
>>> Is there a way to do that?
>>>
>>> The members gets dynamically added. I'm using asterisk 1.4.21.2.
>>>
>>> _______________________________________________
>>> -- Bandwidth and Colocation Provided by http://www.api-digital.com --
>>>
>>> asterisk-users mailing list
>>> To UNSUBSCRIBE or update options visit:
>>>    http://lists.digium.com/mailman/listinfo/asterisk-users
>>>
>>>       
>> Why would you want to do that? The purpose of the autopause is to
>> discard the "absent" agent that is not responding to the calls to not
>> try it anymore until it gets unpaused by a supervisor or someone else,
>> and therefore the pause is made to all queues the agent is member of.
>> Why pause it on only one queue, letting it ring on other queues?
>>
>> Aside from the purpose you have on this, I think you would need to
>> modify the app_queue.c code to make the parameter configurable inside
>> each queue definition and not on the general section of queues.conf.
>> Then you would need to modify the logic to handle the autopause
>> configured for each queue. This is a general idea as I didn't take a
>> deep look of app_queue.c to see how it works exactly.
>>
>> Any other solution without changing asterisk code would imply a external
>> application that monitors the queues and makes the custom autopause you
>> need.
>>
>> Just my two cents...
>>
>> --
>> Ing. Miguel Molina
>> Grupo de Tecnología
>> Millenium Phone Center
>>
>>
>> _______________________________________________
>> -- Bandwidth and Colocation Provided by http://www.api-digital.com --
>>
>> asterisk-users mailing list
>> To UNSUBSCRIBE or update options visit:
>>   http://lists.digium.com/mailman/listinfo/asterisk-users
>>
>>     
>
> To make things clearer:
>
> I want  the queue member is autopaused on all queues. As a matter of
> fact in asterisk (vers. 1.4.24.1)
> the queue member is only paused on one Queue.
>
> I tried setting autopause=yes in general context, which doesn't do anything.
> So i set autopause=yes in every Queue definition, which is working,
> but only on that queue.
>
> I don't use the agents channel (well i tried, with ending up in lots
> of trouble), because its
> depreciated in asterisk 1.4 and gone in 1.6. so i decided to
> do as proposed in UPGRADE.txt and
> asterisk-src/doc/queues-with-callback-members.txt,
> with one change, i'm not using the Local channel, because it is not
> showing the right status
> of the devices in the queue. (I wonder how the callcenter at digiums
> ist working with that).
>
> maybe anyone else having problems with queues in asterisk 1.4?
>
> yours
> christian gansberger
>   
You're right, the autopause on its standard behavior pauses only the 
member of the queue where it belongs. Taking a little look at 
app_queue.c (http://www.asterisk.org/doxygen/1.4/app__queue_8c.html) you 
can very easily patch the source code to achieve the functionality you 
want. The key functions are:

static int set_member_paused -> Traverses the queues doing all the 
things necessary on all different scenarios (realtime, etc) to pause the 
member you give to it. If there's no queue name given, it with pause the 
member on all queues (the PAUSEALL event).

static void rna -> (as the doxygen doc says) RNA == Ring No Answer. 
Common code that is executed when we try a queue member and they don't 
answer.

If you take a look to the rna function, with autopaused enabled it will 
pause the member if it doesn't answer the queue call after the timeout 
time. You can make it pause all members just by changing this one line:

02164       if (!set_member_paused <http://www.asterisk.org/doxygen/1.4/app__queue_8c.html#d61f43e341bcf4c523f2fdb01ece066b>(qe->parent <http://www.asterisk.org/doxygen/1.4/structqueue__ent.html#59ceee334ec79ed344313a7e8affb3fc>->name <http://www.asterisk.org/doxygen/1.4/structcall__queue.html#188159d17b341b26fcfe4b57baefd372>, interface <http://www.asterisk.org/doxygen/1.4/structcallattempt.html#8ee1350d5c943c7ee1ad3da9078eda25>, 1)) {

to

02164       if (!set_member_paused <http://www.asterisk.org/doxygen/1.4/app__queue_8c.html#d61f43e341bcf4c523f2fdb01ece066b>("", interface <http://www.asterisk.org/doxygen/1.4/structcallattempt.html#8ee1350d5c943c7ee1ad3da9078eda25>, 1)) {


That way we don't send the queue name, pausing it in all the queues it 
is member of.

Although it's not tested, it might work for you. That's the beauty of 
Asterisk and well documented Open Source projects, you can get to the 
code as deep as you want, learn from it how it works, and change 
it/improve it according to your needs. Good contributions make it to the 
official code as well.

Cheers,

-- 
Ing. Miguel Molina
Grupo de Tecnología
Millenium Phone Center

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.digium.com/pipermail/asterisk-users/attachments/20090709/60e610f5/attachment-0001.htm 


More information about the asterisk-users mailing list