[OPEN-ILS-DEV] Asterisk scheduling controls
Doug Kyle
dkyle at grpl.org
Wed Dec 16 11:01:11 EST 2009
Bill Ott wrote:
>
>>
>> On Tue, Dec 15, 2009 at 3:34 PM, Bill Ott <bott at grpl.org
>> <mailto:bott at grpl.org>> wrote:
>>
>> Josh Stompro said the following on 12/15/2009 03:06 PM:
>>> Joe Atzberger wrote:
>>>> In the course of integrating Asterisk telephony with
>>>> Evergreen's action/trigger notice structure, we have
>>>> encountered a problem that you may have already come across, or
>>>> possibly even solved. The question is basically how to
>>>> schedule call times (on the asterisk side), i.e. start at 9AM,
>>>> stop at 9PM.
>>>> We are generating callfiles that are queued by moving them into
>>>> the Asterisk spool directory. We can tell Asterisk not to call
>>>> before a certain time by setting the file's date modified time
>>>> in the future. So we have a mechanism for the "begin" time.
>>>> What we don't have is a mechanism to tell asterisk *not* to
>>>> call after a given "end" time. Anything that is in the
>>>> dialplan logic itself does not appear suitable because that
>>>> still processes the callfile and either succeeds or fails.
>>>> What we want is to *not* process the callfile, deferring it
>>>> until the next start time.
>>>> The reason there has to be a cutoff is that EG might spool up
>>>> several thousand calls to fire at the "begin" time, and it is
>>>> conceivable that not all calls would be completed by the
>>>> intended end.
>>>> Things we've ruled out:
>>>>
>>>> * just turning off/on asterisk -- can't do that since local
>>>> voicemail, incoming calls and desktop phones might depend on
>>>> asterisk
>>>> * trying to adjust callfile date modified time inside
>>>> dialplan --
>>>> doesn't work, because the file is still processed, i.e.
>>>> moved to
>>>> the "done" dir at the end
>>>>
>>>> So are there any solutions you guys have encountered? This
>>>> problem is very similar to print queue management on unix, so
>>>> there may be products/packages in that problem-space that would
>>>> work for us.
>>>> --Joe
>>> I'm not at all familiar with the call files, so this is probably
>>> not an option, but would it be possible to move all spooled
>>> calls out of the call dir at a certain time, except the ones
>>> that are currently in use, and move them back in the next start
>>> time... Or modify the date modified time of all the files not
>>> currently in use at 9pm every night to be for 9am the next
>>> morning. That would cause the system to skip them all until the
>>> next morning, right?
>>>
>>> As well as set stop and start times, would it be possible to
>>> optionally not have the system call a customer while their home
>>> library is not open. That way there would always be staff
>>> available at a customers library if they had questions and
>>> wanted to call back. Assuming that EG takes into account
>>> holidays, it would also keep calls from being placed on holidays
>>> also. This wouldn't work for every location though, so it
>>> should probably be a per OU setting.
>> This is precisely what we do. We call
>> 'open-ils.actor.org_unit.closed.retrieve.all' and*
>> *'open-ils.actor.org_unit.hours_of_operation.retrieve' to see if
>> the library is open on a given day before we queue up the call.
>>
>> We use an external notification server to place calls for both
>> overdue and hold notifications. see:
>> http://svn.open-ils.org/trac/ILS-Contrib/browser/grpl/trunk/patron_notifications
>>
>> Back to the original question which Doug already commented on.
>> When we first started using this method we tried dumping all of
>> our call files into the spool directory at once. This worked
>> fine in testing with a handful of calls, but with hundreds of
>> files, Asterisk choked on them and started locking up outgoing lines.
>>
>>
>> Thanks for the responses. There are some viable options in here.
>> Our problem isn't knowing when to schedule the call (i.e. "open
>> hours"), it's knowing how to un/reschedule it when we get to closing
>> time. Options seem to be:
>>
>> 1. shutdown asterisk (instance)
>> 2.
>> maybe unload just the spool module part of asterisk (pbx_spool
>> iirc)
>> 3. mv callfiles outside spool directory, mv back at "open" time
>> 4. update date modified to next "open" time
>> 5. never queue more than one round of calls per channel, so there
>> *shouldn't* be much backlog
>>
>> The first is dead certain, but also overkill. If we wanted to go
>> that route, I would push for a proxy layer that EG can treat like one
>> Asterisk instance, rather than needing a bunch of different instance
>> configs.
Is a couple couple cron calls overkill compared to a proxy layer? IMO a
shutdown of Asterisk is just proper insurance against any untimely
calls, and I would want a separate Asterisk box/instance for EG calls vs
my main phone system. You don't need to unschedule calls if you use a
temp dir and have a program feed the call files to the spool dir, you
simply stop that program. Any left over call files are left in the temp
dir.
>>
>> The latter (#5) doesn't work w/ future-dated callfiles, since they
>> *should* accumulate in spool. But maybe accumulation in spool is to
>> be avoided, as Bill suggests. That would seem counter to the entire
>> purpose of a spool, but it wouldn't really surprise me either.
I started with future-dated call files, but discovered that too many
call files in the spool dir seems to be a well known Asterisk issue.
>>
>> I intend to avoid requiring that asterisk query back to the EG server
>> to figure out when an OU is open/closed. For one thing, Asterisk has
>> no idea what OU is relevant. It's hard enough for EG to know, and
>> the rules for that could be arbitrarily complex:
>>
>> * If a user has 3 overdues from 3 branches, and one is closed,
>> make the call?
>> * If all are open but the user's home branch is closed, make the
>> call?
>> * If all are closed but the user's home branch is open, call?
>>
>> It is a little more obvious in the case of hold pickup notices since
>> the pickup branch is the only one that really matters, but there are
>> still good performance reasons to avoid this requerying altogether.
>> When we send the file, we can include data about TTL, but since we
>> have already made use of the date modified, we would need to hold the
>> data in an external DB or have the mediator read through the content
>> of the file on the asterisk side to extract the data. I also want to
>> avoid that, if possible.
We only consider closed dates for pickup calls, and the relevant OU
(pickup lib) is set as a variable in each call file. In our case,
Asterisk itself does not query EG for those as we batch create call
files from a perl program every morning. We do have asterisk call a cgi
script on EG that creates a hold notification after a pickup call, but
that has never caused any performance issues.
>>
>> The most worrying report is that Asterisk choked on a spool
>> containing a few hundred files. Bill, can you say what version of
>> asterisk it was and whether you were using SIP or traditional lines?
>
>
> We're running 1.4 with multiple 4-port ZapTel cards and analog lines
> from our PBX. No SIP in our case.
>
> Calling out on 7 lines, today we initiated 473 and completed 405 calls
> in about 4.25 hours. So, we can easily feed the spool and not have to
> worry about running late. But just in case, we shut it down
> (programatically) at 6:00PM local time.
>
>
More information about the Open-ils-dev
mailing list