30.11.2016, 10:41 | #1 |
Снова балуюсь косаптой :)
|
DAX 2009. Как отлаживать BatchJob?
Ситуация такая. Имеем некое периодическое задание (потомок RunBaseBatch), суть которого - в периодической рассылке email-ов клиентам.
BatchJob работает в принципе нормально, но примерно раз в три дня намертво виснет. После того, как его вручную прибить и снова запустить - отрабатывает как ни в чем не бывало... Поставлена задача - найти и устранить причину зависонов. Объем кода периодического задания довольно значителен, поэтому "метод научного тыка" представляется крайне контрпродуктивным... кроме того, причина в принципе может крыться не в кривом коде, а в конфигурации bacth сервера, правах доступа и тп. Разумеется, можно создать таблицу логов и всюду в подозрительных местах расставить выброс в этот лог строк со стеком, значениями переменных и т..д. Однако, что-то мне подсказывает, что такого результата можно добиться и без утомительной мышиной возни... Вопрос к гуру: есть ли, например, возможность окружить метод run() соответствующего класса скобками типа PHP код:
__________________
Бесты и регарды! Последний раз редактировалось konfet; 30.11.2016 в 10:49. |
|
30.11.2016, 10:49 | #2 |
Участник
|
Сделать то можно.
Можно по логу выполнения пакетов (History таблички) постфактум анализировать что долго выполнялось. Бывают блокировки на batch табличках которые мешают вовремя стартовать пакетам. Следите за ними. |
|
30.11.2016, 11:12 | #3 |
Снова балуюсь косаптой :)
|
Цитата:
Цитата:
Бывают блокировки на batch табличках которые мешают вовремя стартовать пакетам. Следите за ними.
__________________
Бесты и регарды! |
|
30.11.2016, 12:54 | #4 |
Участник
|
В это табличке есть время старта и время завершения пакета. - можно тупо выгрузить в Excel и посчитать разницу и найти большие значения.
|
|
30.11.2016, 12:59 | #5 |
Участник
|
если отправляете через sysEmailBatch можно попросить администраторов проверить на ошибку sysEmailBatch.parmEmailAddr() адресс рассылки. У меня clr error периодически вонзникал. try() catch(retry) помог. Причину так и не нашел. В ax 12 хорошо можно отладить)))
Последний раз редактировалось arhat; 30.11.2016 в 13:06. Причина: грамматика |
|
30.11.2016, 14:13 | #6 |
Moderator
|
Правильнее в таких ситуациях использовать Trace Parser и трассировку сервера. Этот механизм как раз и предназначен чтобы снаружи можно было посмотреть в каких именно методах крутится зависшая (или просто задумывшаяся) сессия. Есть, конечно, шансы что вы вообще трассы не обнаружите, но это будет говорить что либо у вас там запрос на сиквеле висит в блокировке или исполняется 4ые сутки из за кривого плана запроса; либо у вас какой-то тяжелый системный глюк, из за которого реально ядро аксаптовские виснет.
Другой вариант - собрать dump ax32serv.exe в тот момент когда батч висит и проанализировать этот дамп с целью найти функцию и номер строки в которой данная сессия висит. |
|
30.11.2016, 14:53 | #7 |
Участник
|
Цитата:
Сообщение от konfet
Вопрос к гуру: есть ли, например, возможность окружить метод run() соответствующего класса скобками типа
PHP код:
X++: #OCCRetryCount ; try { ttsbegin; // ... ttscommit; } catch (Exception::Deadlock) { retry; } catch (Exception::UpdateConflict) { if (appl.ttsLevel() == 0) { if (xSession::currentRetryCount() >= #RetryNum) { throw Exception::UpdateConflictNotRecovered; } else { retry; } } else { throw Exception::UpdateConflict; } }
__________________
// no comments |
|
30.11.2016, 16:28 | #8 |
Снова балуюсь косаптой :)
|
Цитата:
Сообщение от fed
Правильнее в таких ситуациях использовать Trace Parser и трассировку сервера. Этот механизм как раз и предназначен чтобы снаружи можно было посмотреть в каких именно методах крутится зависшая (или просто задумывшаяся) сессия.
Цитата:
Попробуйте использовать подобную конструкцию. Желательно, чтобы вы не пихали метод run() внутрь защищенной секции, а саму секцию делали внутри конкретного метода, где находится CRUD-операция.
ЗЫ Или же вы имеете ввиду, что catch отработает при любом зависоне, даже если он не вызван SQL операцией? Тогда странно...
__________________
Бесты и регарды! |
|
Теги |
batch, debug code, job, джоб, отладка |
|
|