AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.11.2016, 10:41   #1  
konfet is offline
konfet
Снова балуюсь косаптой :)
 
143 / 50 (2) ++++
Регистрация: 23.04.2003
Адрес: Moscow
DAX 2009. Как отлаживать BatchJob?
Ситуация такая. Имеем некое периодическое задание (потомок RunBaseBatch), суть которого - в периодической рассылке email-ов клиентам.
BatchJob работает в принципе нормально, но примерно раз в три дня намертво виснет. После того, как его вручную прибить и снова запустить - отрабатывает как ни в чем не бывало...
Поставлена задача - найти и устранить причину зависонов.
Объем кода периодического задания довольно значителен, поэтому "метод научного тыка" представляется крайне контрпродуктивным... кроме того, причина в принципе может крыться не в кривом коде, а в конфигурации bacth сервера, правах доступа и тп.
Разумеется, можно создать таблицу логов и всюду в подозрительных местах расставить выброс в этот лог строк со стеком, значениями переменных и т..д. Однако, что-то мне подсказывает, что такого результата можно добиться и без утомительной мышиной возни...
Вопрос к гуру: есть ли, например, возможность окружить метод run() соответствующего класса скобками типа

PHP код:
try
{
  
run();
}
catch(
Exception::<что-то>)
{
  
//  если время выполнения джоба больше заданного значения, то 
  //  заканчивать/перезапускать/выполнять другие действия 
  //  типа записи обстоятельств зависона в лог. В идеале - выплевывать 
  // в инфолог информацию, на какой именно строке кода зависон произошел.  

или же, может быть, есть и другой рациональный подход к решению такой задачи? Профайлер?
__________________
Бесты и регарды!

Последний раз редактировалось konfet; 30.11.2016 в 10:49.
Старый 30.11.2016, 10:49   #2  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,953 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Сделать то можно.
Можно по логу выполнения пакетов (History таблички) постфактум анализировать что долго выполнялось.
Бывают блокировки на batch табличках которые мешают вовремя стартовать пакетам. Следите за ними.
Старый 30.11.2016, 11:12   #3  
konfet is offline
konfet
Снова балуюсь косаптой :)
 
143 / 50 (2) ++++
Регистрация: 23.04.2003
Адрес: Moscow
Цитата:
Сообщение от Logger Посмотреть сообщение
Сделать то можно.
Можно по логу выполнения пакетов (History таблички) постфактум анализировать что долго выполнялось.
Это вы про кнопочку log на форме Batch Job History? Увы, создатели job-a не озаботились вообще никаким инфологом... переписывать надо будет.
Цитата:
Бывают блокировки на batch табличках которые мешают вовремя стартовать пакетам. Следите за ними.
А что это за таблички и блокировки и как с ними бороться? на SQL сервере с помощью sp_locks()? Киньте, пожалуйста ссылкой, где про это почитать.
__________________
Бесты и регарды!
Старый 30.11.2016, 12:54   #4  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,953 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от konfet Посмотреть сообщение
Это вы про кнопочку log на форме Batch Job History? Увы, создатели job-a не озаботились вообще никаким инфологом... переписывать надо будет.
В это табличке есть время старта и время завершения пакета. - можно тупо выгрузить в Excel и посчитать разницу и найти большие значения.
Старый 30.11.2016, 12:59   #5  
arhat is offline
arhat
Участник
 
116 / 16 (1) ++
Регистрация: 10.11.2014
Адрес: Казахстан
если отправляете через sysEmailBatch можно попросить администраторов проверить на ошибку sysEmailBatch.parmEmailAddr() адресс рассылки. У меня clr error периодически вонзникал. try() catch(retry) помог. Причину так и не нашел. В ax 12 хорошо можно отладить)))

Последний раз редактировалось arhat; 30.11.2016 в 13:06. Причина: грамматика
Старый 30.11.2016, 14:13   #6  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,909 / 5730 (197) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Правильнее в таких ситуациях использовать Trace Parser и трассировку сервера. Этот механизм как раз и предназначен чтобы снаружи можно было посмотреть в каких именно методах крутится зависшая (или просто задумывшаяся) сессия. Есть, конечно, шансы что вы вообще трассы не обнаружите, но это будет говорить что либо у вас там запрос на сиквеле висит в блокировке или исполняется 4ые сутки из за кривого плана запроса; либо у вас какой-то тяжелый системный глюк, из за которого реально ядро аксаптовские виснет.

Другой вариант - собрать dump ax32serv.exe в тот момент когда батч висит и проанализировать этот дамп с целью найти функцию и номер строки в которой данная сессия висит.
Старый 30.11.2016, 14:53   #7  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от konfet Посмотреть сообщение
Вопрос к гуру: есть ли, например, возможность окружить метод run() соответствующего класса скобками типа

PHP код:
try
{
  
run();
}
catch(
Exception::<что-то>)
{
  
//  если время выполнения джоба больше заданного значения, то 
  //  заканчивать/перезапускать/выполнять другие действия 
  //  типа записи обстоятельств зависона в лог. В идеале - выплевывать 
  // в инфолог информацию, на какой именно строке кода зависон произошел.  

или же, может быть, есть и другой рациональный подход к решению такой задачи? Профайлер?
Попробуйте использовать подобную конструкцию. Желательно, чтобы вы не пихали метод run() внутрь защищенной секции, а саму секцию делали внутри конкретного метода, где находится CRUD-операция. На выбросе исключения можете вывести конкретное сообщение в инфолог.
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  
konfet is offline
konfet
Снова балуюсь косаптой :)
 
143 / 50 (2) ++++
Регистрация: 23.04.2003
Адрес: Moscow
Цитата:
Сообщение от fed Посмотреть сообщение
Правильнее в таких ситуациях использовать Trace Parser и трассировку сервера. Этот механизм как раз и предназначен чтобы снаружи можно было посмотреть в каких именно методах крутится зависшая (или просто задумывшаяся) сессия.
Спасибо, будем пробовать...
Цитата:
Попробуйте использовать подобную конструкцию. Желательно, чтобы вы не пихали метод run() внутрь защищенной секции, а саму секцию делали внутри конкретного метода, где находится CRUD-операция.
Это, наверное, не мой случай, так как рассылка мейлов, очевидно не связана с блокировками SQL. И если там есть и какие-нибудь апдейты, то 99% не они являются причиной зависона. Но все равно спасибо.
ЗЫ
Или же вы имеете ввиду, что catch отработает при любом зависоне, даже если он не вызван SQL операцией? Тогда странно...
__________________
Бесты и регарды!
Теги
batch, debug code, job, джоб, отладка

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
emeadaxsupport: List of fixes that improve performance of certain features in Dynamics AX 2009 Blog bot DAX Blogs 0 13.10.2009 19:06
msdynamicsax: DAX 2009 and MS SQL 2008 Blog bot DAX Blogs 0 09.08.2008 14:05
axStart: Microsoft Dynamics AX 2009 Hot Topics Web Seminar Series Blog bot DAX Blogs 0 06.08.2008 12:05
msdynamicsax: Enterprise Portal development in DAX 2009 Blog bot DAX Blogs 0 18.04.2008 07:06

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 15:04.