Overview
Hangup handlers are subroutines attached to a channel that will execute when that channel hangs up. Unlike the traditional h extension, hangup handlers follow the channel. Thus hangup handlers are always run when a channel is hung up, regardless of where in the dialplan a channel is executing.
Multiple hangup handlers can be attached to a single channel. If multiple hangup handlers are attached to a channel, the hangup handlers will be executed in the order of most recently added first.
Dialplan Applications and Functions
All manipulation of a channel's hangup handlers are done using the CHANNEL function. All values manipulated for hangup handlers are write-only.
hangup_handler_push
Used to push a hangup handler onto a channel.
same => n,Set(CHANNEL(hangup_handler_push)=[[context,]exten,]priority[(arg1[,...][,argN])]);
hangup_handler_pop
Used to pop a hangup handler off a channel. Optionally, a replacement hangup handler can be added to the channel.
same => n,Set(CHANNEL(hangup_handler_pop)=[[[context,]exten,]priority[(arg1[,...][,argN])]]);
hangup_handler_wipe
Remove all hangup handlers on the channel. Optionally, a new hangup handler can be pushed onto the channel.
same => n,Set(CHANNEL(hangup_handler_wipe)=[[[context,]exten,]priority[(arg1[,...][,argN])]]);
Examples
Adding hangup handlers to a channel
In this example, three hangup handlers are added to a channel: hdlr3, hdlr2, and hdlr1. When the channel is hung up, they will be executed in the order of most recently added first - so hdlr1 will execute first, followed by hdlr2, then hdlr3.
Removing and replacing hangup handlers
In this example, three hangup handlers are added to a channel: hdlr3, hdlr2, and hdlr1. Using the CHANNEL function's hangup_handler_pop value, hdlr1 is removed from the stack of hangup handlers. Then, using the hangup_handler_pop value again, hdlr2 is replaced with hdlr4. When the channel is hung up, hdlr4 will be executed, followed by hdlr3.
CLI Commands
Single channel
core show hanguphandlers <chan>
Output
Channel Handler <chan-name> <first handler to execute> <second handler to execute> <third handler to execute>
All channels
core show hanguphandlers all
Output
Channel Handler <chan1-name> <first handler to execute> <second handler to execute> <third handler to execute> <chan2-name> <first handler to execute> <chan3-name> <first handler to execute> <second handler to execute>
Hangup handlers are similar to theh
extension - they execute logic on a channel when that channel is hung up. Unlike theh
extension however, they are associated explicitly with a channel. If a channel moves between contexts it will still safely execute its hangup handlers - while if a channel moved into a context that did not contain anh
extension, it would not execute theh
extension in the context it just left.
[hdlr1] exten => s,1,Verbose(0, Executed First) same => n,Return() [context_one] exten => s,1,Set(CHANNEL(hangup_handler_push)=hdlr1,s,1(args)); same => n,Goto(context_two,s,1) exten => h,1,Verbose(1, I wont be executed if the channel hangs up in context_two) [context_two] exten => s,1,Verbose(1, The hangup handler pushed in context_one will still get executed) same => n,Verbose(1, The h extension in context_one wont) same => n,Hangup()
No hay comentarios:
Publicar un comentario