[asterisk-users] Cascading Queues

Robert Lister robl at linx.net
Thu May 17 17:39:53 MST 2007


On Thu, May 17, 2007 at 03:50:52PM -0400, Jason Adams wrote:
> Scenario 1:
> We are working with a client that currently has one support queue with
> about 10 agents.  They are starting to get pretty long hold times for
> their customers and they have requested three queues.  Queue 1 will have
> a timeout of 4 minutes.  After that it will move to Queue 2 which has a
> default timeout of 3 minutes.  After that we will transfer the call to
> the receptionist who will either take a message or put them back in the
> queue with a higher priority if they want to continue to hold.  Queue 2
> will have more agents in that queue plus the agents that were in Queue
> 1.
>  
> Question:
> Can I have the same agents in multiple queues to work the way I'm
> thinking above?  So if the caller reaches Queue 2 the agents from Queue
> 1 will be available if they get off a call, plus new agents are added
> into Queue 2.

You can have the same agents in multiple queues, chan_agent only allows one 
call to happen per agent channel. As long as you are not mixing Agent/xxx 
and SIP/xxx destinations which are routing to the same people in the queues, 
it should work. (When an agent channel is busy, the SIP channel might not 
be, and vice-versa.)

> So I'm thinking something like:
> exten => s,1,Queue(support1)
> exten => s,2,Queue(support2)
> exten => s,3,Dial(SIP/${RECEPTIONIST})
>  
> Then the receptionist would just dial a special extension which would
> add priority=10 to the queue.

You might want to check the ${QUEUESTATUS} so you can work out why the call 
dropped out of the first queue, and if you want it to immediately drop out 
of the first queue if it is full, or sit there for 4 minutes waiting etc.
(In queues.conf, check the joinempty/leavewhenempty options for the queue, 
then check it like:- (where the numbers are priorites you want to jump to)

exten => _s,n,GotoIf($["${QUEUESTATUS}" = "UNKNOWN"]?500)
exten => _s,n,GotoIf($["${QUEUESTATUS}" = "BUSY"]?850)
exten => _s,n,GotoIf($["${QUEUESTATUS}" = "FULL"]?850)
exten => _s,n,GotoIf($["${QUEUESTATUS}" = "JOINUNAVAIL"]?650)
exten => _s,n,GotoIf($["${QUEUESTATUS}" = "LEAVEUNAVAIL"]?650)
exten => _s,n,GotoIf($["${QUEUESTATUS}" = "LEAVEEMPTY"]?650)
exten => _s,n,GotoIf($["${QUEUESTATUS}" = "TIMEOUT"]?700)

Your setup will need a bit of work, for example what will happen if the 
receptionist is not available, how to trap calls going round and round in 
loops etc. You could automate bits of this further. (Maybe with the 
voicemail app and a breakout 'o' extn, and record a greeting that says 
"leave us a message, or press 0 to continue to hold...")

> Scenario 2:
> This same customer is starting to sell their product internationally.
> They are purchasing VOIP DID's from various countries for local calls
> from that area.  Would this just be like setting up a regular VOIP line
> to register the account in sip.conf and then creating a context for
> those countries so we know where they are coming from?

Yes. The sip.conf entry for the peer will point it to the right context=, 
and/or the register= statement can point to a specific extension, so you can 
tell where the call is coming from either way.

If you want to place outbound calls via those numbers to return calls etc, 
then you will probably need to add a prefix as the call comes in (Hack the 
${CALLERID(num)} on the way in to add the prefix so the call goes back out 
the right way.)

Rob




More information about the asterisk-users mailing list