09.07.2012, 16:27 | #1 |
Участник
|
Вопрос по 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 |
NavAx
|
Добавить runtime task с зависимостями от всех остальных runtime task разносок. Место где пилить указано верно.
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты... |
|
09.07.2012, 16:40 | #3 |
Moderator
|
На самом деле, батч-сервер отслеживает зависимости между задачами. Для каждой задачи можно задать список зависимостей. Соответственно данная задача будет запущена только после того как завершаться все задачи в ее списке зависимостей.
В SalesFormRun зависимости создаются вызовом: X++: if(printout == Printout::After)
{
batchHeader.addDependency(salesFormLetterEndMultiThread,formLetterMultiThread,BatchDependencyStatus::FinishedOrError);
} |
|
09.07.2012, 16:43 | #4 |
Участник
|
Цитата:
По поводу dependencies это то собственно и смущало, это ж, стало быть, если постятся 200 ордеров то (допустим, что у нас не summary update, но и не split by delivery information) это 200 dependencies для одного моего таска. Эффективно ли для системы будет каждый раз при взятии на обработку нового бандла тасков проверять эти зависимости. Так что попробую модифицировать SalesFormLetterEndMultiThread. И уж если не получится, тогда создам свой батч и добавлю к нему зависимости через BatchHeader.addDependency.
__________________
Axapta has seduced me deadly! |
|
09.07.2012, 16:52 | #5 |
Участник
|
Цитата:
То есть между salesFormLetterEndMultiThread и formLetterMultiThread никаких зависимостей в коде SalesFormLetter не устанавливается. Более того, в 2009 salesFormLetterEndMultiThread выполняется только один раз за весь постинг. То есть, создается всего один инстанс и ДО создания индивидуальных formLetterMultiThread инстансов(под каждый salesParmTable).
__________________
Axapta has seduced me deadly! |
|
09.07.2012, 17:03 | #6 |
Moderator
|
Цитата:
Сообщение от HorrR
Вы про SalesFormLetter.run? Если да, то в 2009 такого когда в run нет. Возможно это справедливо для 4ки или 2012, которых у меня под рукой нет.
То есть между salesFormLetterEndMultiThread и formLetterMultiThread никаких зависимостей в коде SalesFormLetter не устанавливается. Более того, в 2009 salesFormLetterEndMultiThread выполняется только один раз за весь постинг. То есть, создается всего один инстанс и ДО создания индивидуальных formLetterMultiThread инстансов(под каждый salesParmTable). |
|
|
За это сообщение автора поблагодарили: HorrR (1). |
09.07.2012, 17:19 | #7 |
Участник
|
Цитата:
В итоге на SYP пропала строчка(именно та, о которой вы говорите) X++: batchHeader.addDependency(salesFormLetterEndMultiThread,formLetterMultiThread,BatchDependencyStatus::FinishedOrError); X++: ttsbegin; batchHeader.save(); ttscommit; 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 |
Участник
|
Нормально там все отрабатывает... 200 зависимостей - это просто 200 записей в BatchConstraints; логика запуска пакетных заданий явно их в любом случае не перебирает, а просто использует запросы обновления статусов пакетников с exists join/notexists join по этой таблице.
|
|
|
За это сообщение автора поблагодарили: HorrR (1). |
09.07.2012, 17:45 | #9 |
Участник
|
Да, Вы правы.
__________________
Axapta has seduced me deadly! |
|
|
|