Ситуация такая. Имеем некое периодическое задание (потомок RunBaseBatch), суть которого - в периодической рассылке email-ов клиентам.
BatchJob работает в принципе нормально, но примерно раз в три дня намертво виснет. После того, как его вручную прибить и снова запустить - отрабатывает как ни в чем не бывало...
Поставлена задача - найти и устранить причину зависонов.
Объем кода периодического задания довольно значителен, поэтому "метод научного тыка" представляется крайне контрпродуктивным... кроме того, причина в принципе может крыться не в кривом коде, а в конфигурации bacth сервера, правах доступа и тп.
Разумеется, можно создать таблицу логов и всюду в подозрительных местах расставить выброс в этот лог строк со стеком, значениями переменных и т..д. Однако, что-то мне подсказывает, что такого результата можно добиться и без утомительной мышиной возни...
Вопрос к гуру: есть ли, например, возможность окружить метод run() соответствующего класса скобками типа
PHP код:
try
{
run();
}
catch(Exception::<что-то>)
{
// если время выполнения джоба больше заданного значения, то
// заканчивать/перезапускать/выполнять другие действия
// типа записи обстоятельств зависона в лог. В идеале - выплевывать
// в инфолог информацию, на какой именно строке кода зависон произошел.
}
или же, может быть, есть и другой рациональный подход к решению такой задачи? Профайлер?