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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.07.2012, 16:27   #1  
HorrR is offline
HorrR
Участник
 
340 / 30 (2) +++
Регистрация: 18.02.2008
Адрес: Киев
Вопрос по multi-thread batch posting SO. DAX 2009
Здравствуйте,

Возникла задача в конце батч постинга сейлз ордеров(picking list) выполнять некоторые свои действия(то есть, после того как постинг был выполнен для ВСЕХ ордеров).
Собственно переход к multi-thread батч постингу виден в SalesFormLetter.run().
Там для каждого sales хедера попавшего под условия запроса(query) добавляется runtime task в виде экземпляра FormLetterMultiThread.
Проблема в том, что я не уверен насчет того, в какой последовательности эти таски потом отрабатывают. То есть, есть догадки, но нет точного знания.
Интуиция подсказывает, что, скорее всего, мой код нужно добавлять в SalesFormLetterEndMultiThread, а то, что в SalesFormLetter.run() его инстанс добавляется ДО добавления индивидуальных FormLetterMultiThread инстансов наталкивает на мысль о стэке тасков в батче(LIFO). Ну и, скорее всего, потом эти таски вынимаются на параллельное выполнение из батч хэдэра бандлами по N штук, где N - параметр количества батч потоков на сервере.

НО, во-первых, это только догадки, и всё же хотелось бы спросить умных и опытных людей на сколько они близки к правде.
Во-вторых, можно ли как-то явно указать, чтобы таск добавленный в батч хэдер был выполнен обязательно ПОСЛЕ всех остальных тасков или же этого можно добиться только порядком добавления таска в батч хэдэр? Если второе, то каким образом гарантируется, что SalesFormLetterEndMultiThread не будет выполнен параллельно с одним из FormLetterMultiThread или параллельность в таком случае зависит от classID процесса?

П.С. Заранее прошу прощения за вопросы, которые кому-то, возможно, покажутся ламерскими. Уповаю на вашу снисходительность и опыт
__________________
Axapta has seduced me deadly!
Старый 09.07.2012, 16:31   #2  
Maximin is offline
Maximin
NavAx
NavAx Club
 
412 / 346 (12) ++++++
Регистрация: 09.10.2002
Адрес: Москва
Добавить runtime task с зависимостями от всех остальных runtime task разносок. Место где пилить указано верно.
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты...
Старый 09.07.2012, 16:40   #3  
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
На самом деле, батч-сервер отслеживает зависимости между задачами. Для каждой задачи можно задать список зависимостей. Соответственно данная задача будет запущена только после того как завершаться все задачи в ее списке зависимостей.
В SalesFormRun зависимости создаются вызовом:
X++:
   if(printout == Printout::After)
          {
                        batchHeader.addDependency(salesFormLetterEndMultiThread,formLetterMultiThread,BatchDependencyStatus::FinishedOrError);
          }
Так что гипотеза про бандлы и LIFO - не верна. Система просто тупо запускает (по крйней мере - переводит в статус Ready) все задачи у которых либо нету зависимостей либо все зависимости уже завершились. Если есть большое желание, можно самостоятельно раскопать логику активации задач в классе BatchRun::ServerProcessDependencies...
Старый 09.07.2012, 16:43   #4  
HorrR is offline
HorrR
Участник
 
340 / 30 (2) +++
Регистрация: 18.02.2008
Адрес: Киев
Цитата:
Сообщение от Maximin Посмотреть сообщение
Добавить runtime task с зависимостями от всех остальных runtime task разносок. Место где пилить указано верно.
Спасибо за быстрый и обнадеживающий ответ!
По поводу dependencies это то собственно и смущало, это ж, стало быть, если постятся 200 ордеров то (допустим, что у нас не summary update, но и не split by delivery information) это 200 dependencies для одного моего таска. Эффективно ли для системы будет каждый раз при взятии на обработку нового бандла тасков проверять эти зависимости. Так что попробую модифицировать SalesFormLetterEndMultiThread. И уж если не получится, тогда создам свой батч и добавлю к нему зависимости через BatchHeader.addDependency.
__________________
Axapta has seduced me deadly!
Старый 09.07.2012, 16:52   #5  
HorrR is offline
HorrR
Участник
 
340 / 30 (2) +++
Регистрация: 18.02.2008
Адрес: Киев
Цитата:
Сообщение от fed Посмотреть сообщение
В SalesFormRun зависимости создаются вызовом:
X++:
   if(printout == Printout::After)
          {
                        batchHeader.addDependency(salesFormLetterEndMultiThread,formLetterMultiThread,BatchDependencyStatus::FinishedOrError);
          }
Вы про SalesFormLetter.run? Если да, то в 2009 такого когда в run нет. Возможно это справедливо для 4ки или 2012, которых у меня под рукой нет.
То есть между salesFormLetterEndMultiThread и formLetterMultiThread никаких зависимостей в коде SalesFormLetter не устанавливается. Более того, в 2009 salesFormLetterEndMultiThread выполняется только один раз за весь постинг. То есть, создается всего один инстанс и ДО создания индивидуальных formLetterMultiThread инстансов(под каждый salesParmTable).
__________________
Axapta has seduced me deadly!
Старый 09.07.2012, 17:03   #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
Цитата:
Сообщение от HorrR Посмотреть сообщение
Вы про SalesFormLetter.run? Если да, то в 2009 такого когда в run нет. Возможно это справедливо для 4ки или 2012, которых у меня под рукой нет.
То есть между salesFormLetterEndMultiThread и formLetterMultiThread никаких зависимостей в коде SalesFormLetter не устанавливается. Более того, в 2009 salesFormLetterEndMultiThread выполняется только один раз за весь постинг. То есть, создается всего один инстанс и ДО создания индивидуальных formLetterMultiThread инстансов(под каждый salesParmTable).
Код взят из SalesFormLetter.run(), DAX2009CU8. На голом SP1 похожий код тоже есть, просто перед ним нету if()
За это сообщение автора поблагодарили: HorrR (1).
Старый 09.07.2012, 17:19   #7  
HorrR is offline
HorrR
Участник
 
340 / 30 (2) +++
Регистрация: 18.02.2008
Адрес: Киев
Цитата:
Сообщение от fed Посмотреть сообщение
Код взят из SalesFormLetter.run(), DAX2009CU8. На голом SP1 похожий код тоже есть, просто перед ним нету if()
Хм, что-то крайне странное. Сравнил компаратором SYS и SYP.

В итоге на SYP пропала строчка(именно та, о которой вы говорите)
X++:
batchHeader.addDependency(salesFormLetterEndMultiThread,formLetterMultiThread,BatchDependencyStatus::FinishedOrError);
Зато появилось следующее:
X++:
ttsbegin;
    batchHeader.save();
ttscommit;
Версия Ax - 5.0.1500.3761 Dynamics AX 2009 SP1 RU-6 (Rollup 6)

P.S. Кажется, я понял причину. На голом SP1 обязательно добавлялся депенденси, чтобы выполнять salesFormLetterEndMultiThread всегда последним. Где-то между голым SP1 и 6 ролапом оказалось, что не всегда, ведь это зависит от того, какое значение у PrintOut. Понять поняли, а пофиксили коряво, просто убрав добавление зависимости. Где-то между 6 и 8мым ролапом одумались и добавили условие с PrintOut
__________________
Axapta has seduced me deadly!

Последний раз редактировалось HorrR; 09.07.2012 в 17:23.
Старый 09.07.2012, 17:42   #8  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от HorrR Посмотреть сообщение
если постятся 200 ордеров то это 200 dependencies для одного моего таска. Эффективно ли для системы будет каждый раз при взятии на обработку нового бандла тасков проверять эти зависимости.
Нормально там все отрабатывает... 200 зависимостей - это просто 200 записей в BatchConstraints; логика запуска пакетных заданий явно их в любом случае не перебирает, а просто использует запросы обновления статусов пакетников с exists join/notexists join по этой таблице.
За это сообщение автора поблагодарили: HorrR (1).
Старый 09.07.2012, 17:45   #9  
HorrR is offline
HorrR
Участник
 
340 / 30 (2) +++
Регистрация: 18.02.2008
Адрес: Киев
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Нормально там все отрабатывает... 200 зависимостей - это просто 200 записей в BatchConstraints; логика запуска пакетных заданий явно их в любом случае не перебирает, а просто использует запросы обновления статусов пакетников с exists join/notexists join по этой таблице.
Да, Вы правы.
__________________
Axapta has seduced me deadly!
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axinthefield: Dynamics AX Event IDs Blog bot DAX Blogs 0 01.03.2011 22:11
daxdilip: Troubleshooting Dynamics AX 2009 EP Thread abort Exception Error Blog bot DAX Blogs 0 05.02.2011 07:13
DAX 2009 некорректный SPID в форме активных пользователей Logger DAX: Программирование 2 05.07.2010 17:19
emeadaxsupport: List of fixes that improve performance of certain features in Dynamics AX 2009 Blog bot DAX Blogs 0 13.10.2009 19:06
axaptapedia: Batch processing Blog bot DAX Blogs 0 29.01.2009 17:05

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

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

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