AXForum  
Go Back   AXForum > Microsoft Dynamics NAV > NAV: Программирование
All
Forgotten Your Password?
Register Forum Rules FAQ Members List Today's Posts Search

 
 
Thread Tools Search this Thread Display Modes
Old 19.04.2011, 18:32   #1  
kudrenko is offline
kudrenko
Участник
 
17 / 10 (1) +
Join Date: 11.11.2010
Здравствуйте! Хотелось бы услышать мнения по следующему вопросу. Есть NAV 4.00 SP2 и NAS, который с периодичностью в 10 минут, запускает соответствующий кодеюнит, где выполняются определенные учетные операции. Зачастую указанного времени достаточно, чтобы выполнить учет всех операции, a иногда и нет... Таким образом, по истечению 10 мин., если все операции не выполнились, снова запускается сессия NAS и происходят не очень хорошие вещи… (т.е. конфликты) Конечно, можно увеличить интервал запуска NAS и не морочить голову, но это не выход… (есть еще другие нюансы)))) Суть вопроса в следующем – возможно ли, каким-то образом, при очередном запуске nas, смотреть, а полностью ли завершилась обработка предыдущего сеанса запуска? Т.е., если предыдущий сеанс еще не завершен, то никаких операций не выполнять, а завершить работу и установить интервал запуска nas, скажем, через 2 минуты (если после 2 минут, предыдущий сеанс обработался, интервал запуска снова необходимо вернуть в 10 мин.). В противном случае, начать обработку.
Old 19.04.2011, 19:03   #2  
alexb_imported is offline
alexb_imported
Участник
 
256 / 12 (1) ++
Join Date: 25.08.2006
Навскидку такой вариант:
использовать SingleInstance функциональность.
Для этого в кодеюните 448 "Job Queue Dispacher" или в собственном отдельном SingleInstance-кодеюните создаёте булевые переменные, которые и включаете TRUE, FALSE по мере надобности, т.е. перед началом работы каждого процесс сам процесс включает булевую переменную типа ProcessComplete=FALSE и потом, если процесс завершён полностью, то ProcessComplete=TRUE. T.e. по идее если по плану следующий процесс стартует через 10 минут, то он первым делом должен обратиться к булевой переменной в SingleInstance-кодеюните и если NOT ProcessComplete, то ждём +10 минут и обращаемся снова. И только если ProcessComplete=TRUE, то стартуем данный процесс. Есть конечно и минус: если по какой-то причине предыдущий процесс вывалился так, что не смог закончить своё пребывание в SingleInstance-кодеюните, то следующий процесс вообще никогда не стартует, так как будет ждать вечно. Но на такой случай можно ждать макс. определённое время и следующий процесс включать принудительно по истечении макс. возможного ожидания.
Old 19.04.2011, 20:03   #3  
RedFox is offline
RedFox
Участник
 
1,441 / 10 (0) +
Join Date: 28.12.2004
Location: Киев
Можно попробовать что-то типа:

OnRun()
CREATE(QueueTimer);
QueueTimer.Interval := 10*60*1000;
QueueTimer.Enable;
...

QueueTimer::TimerEvent()
QueueTimer.Disable;

...
QueueTimer.Enable;
Old 20.04.2011, 10:45   #4  
kudrenko is offline
kudrenko
Участник
 
17 / 10 (1) +
Join Date: 11.11.2010
Ребят, спасибо большое за советы – очень помогли и оба варианта работают. Проверял
Единственное, что способ, который предложил RedFox я переделал вот так:
OnRun()
CREATE(QueueTimer);
QueueTimer.Interval := 10*60*1000;
QueueTimer.Enabled := TRUE;
...


QueueTimer::Timer(MilliSecounds : Integer)
QueueTimer.Enabled := FALSE;

QueueTimer.Enabled := TRUE;
И тоже все заработало.
Old 20.04.2011, 10:47   #5  
Fly is offline
Fly
Участник
Fly's Avatar
 
102 / 10 (1) +
Join Date: 05.10.2007
+1 к RedFox. При реализации интеграции я задействовал:
1. Таблицу интервалов интеграции (содержим режим интеграции - запись, чтение, обновление, id объекта интеграции - товар, клиент и т.д., время интеграции, блокировка).
2. Регистр, в который записывается последняя дата и время записи, чтения и обновления. Если NAS перезапускается, это не приводит к повторному сеансу интеграции. Дата и время берутся из регистра.
3. Таймер, который периодически обращается к кодюниту для сверки текущей даты и времени с сеансами интеграции и регистром.
Old 20.04.2011, 14:53   #6  
DA_NEAL is offline
DA_NEAL
Участник
DA_NEAL's Avatar
Лучший по профессии 2017
Лучший по профессии 2009
 
788 / 54 (3) ++++
Join Date: 05.08.2002
Location: Королев
Вообще не понял зачем запускать и останавливать именно NAS. Пусть NAS работает постоянно, при запуске NAS стартуйте кодъюнит с таймером который и вызывает ваш кодъюнит по таймеру. В этом случае если не завершилось выполнение кодъюнита NAS следующий и не запустит.
__________________
Want to believe...
Old 20.04.2011, 17:31   #7  
Fly is offline
Fly
Участник
Fly's Avatar
 
102 / 10 (1) +
Join Date: 05.10.2007
Quote:
Originally Posted by DA_NEAL View Post
Вообще не понял зачем запускать и останавливать именно NAS. Пусть NAS работает постоянно, при запуске NAS стартуйте кодъюнит с таймером который и вызывает ваш кодъюнит по таймеру. В этом случае если не завершилось выполнение кодъюнита NAS следующий и не запустит.
Объясню почему. Если в объекты вносятся какие-то правки, то NAS необходимо перезапускать, чтобы он работал с новой версией объекта. Если никуда не записывать последнюю дату и время сеанса интеграции, то после перезапуска сеанс повторится. А это не всегда хорошо (например, если выполняются тяжелые задания, типа коррекции себестоимости).
Old 20.04.2011, 20:09   #8  
alexb_imported is offline
alexb_imported
Участник
 
256 / 12 (1) ++
Join Date: 25.08.2006
Quote:
Originally Posted by Fly View Post
Объясню почему. Если в объекты вносятся какие-то правки, то NAS необходимо перезапускать, чтобы он работал с новой версией объекта. Если никуда не записывать последнюю дату и время сеанса интеграции, то после перезапуска сеанс повторится. А это не всегда хорошо (например, если выполняются тяжелые задания, типа коррекции себестоимости).
В настройках NAS службы можно поставить Object Cache Size = 0 и в Навижене в NAS кодеюните прописать в самом начале SELECTLATESTVERSION.
Old 21.04.2011, 11:02   #9  
Fly is offline
Fly
Участник
Fly's Avatar
 
102 / 10 (1) +
Join Date: 05.10.2007
Quote:
Originally Posted by AlexB View Post
Quote:
Originally Posted by Fly View Post
Объясню почему. Если в объекты вносятся какие-то правки, то NAS необходимо перезапускать, чтобы он работал с новой версией объекта. Если никуда не записывать последнюю дату и время сеанса интеграции, то после перезапуска сеанс повторится. А это не всегда хорошо (например, если выполняются тяжелые задания, типа коррекции себестоимости).
В настройках NAS службы можно поставить Object Cache Size = 0 и в Навижене в NAS кодеюните прописать в самом начале SELECTLATESTVERSION.
SELECTLATESTVERSION, как я понимаю, относится к данным - берется последняя версия. А вот про Object Cash Size почитал повнимательнее. Не знал, что можно установить значение 0. Мне не совсем понятно как NAS в этом случае будет работать. Как он будет знать, что необходимо подтянуть новую версию объектов? И если каким-то образом будет знать, хорошее ли это решение при каждом обращении к объекту обновлять его версию?
Old 21.04.2011, 12:46   #10  
alexb_imported is offline
alexb_imported
Участник
 
256 / 12 (1) ++
Join Date: 25.08.2006
Quote:
Originally Posted by Fly View Post
[Не знал, что можно установить значение 0. Мне не совсем понятно как NAS в этом случае будет работать. Как он будет знать, что необходимо подтянуть новую версию объектов? И если каким-то образом будет знать, хорошее ли это решение при каждом обращении к объекту обновлять его версию?
Если Object Cache = 0, то NAS не обращается к версии обьектов в cache (т.к. cache пустой) a работает непосредственно с актуальной версией обьектов. Еффект тот же самый, если вы в опциях своего NAV-client'a ставите Object Cache (KB) = 0 (у нас программисты даже ОБЯЗАНЫ в опциях своего NAV-client'a ставить Object Cache (KB) = 0). Так ведь вам же и нужно, чтобы NAS обращался всегда к актуальной версии объектов в ДБ? При старте NAS загружает в свой cache версию обьектов, а если cache = 0, то NAS вынужден работать с самой актуальной версией обьектов. Проблем я здесь не вижу. NAS работает в продуктивной ДБ, вы импортировали в неё изменённые / новые обьекты, НАС и должен с ними работать.
Old 21.04.2011, 13:05   #11  
Fly is offline
Fly
Участник
Fly's Avatar
 
102 / 10 (1) +
Join Date: 05.10.2007
Quote:
Originally Posted by AlexB View Post
Quote:
Originally Posted by Fly View Post
[Не знал, что можно установить значение 0. Мне не совсем понятно как NAS в этом случае будет работать. Как он будет знать, что необходимо подтянуть новую версию объектов? И если каким-то образом будет знать, хорошее ли это решение при каждом обращении к объекту обновлять его версию?
Если Object Cache = 0, то NAS не обращается к версии обьектов в cache (т.к. cache пустой) a работает непосредственно с актуальной версией обьектов. Еффект тот же самый, если вы в опциях своего NAV-client'a ставите Object Cache (KB) = 0 (у нас программисты даже ОБЯЗАНЫ в опциях своего NAV-client'a ставить Object Cache (KB) = 0). Так ведь вам же и нужно, чтобы NAS обращался всегда к актуальной версии объектов в ДБ? При старте NAS загружает в свой cache версию обьектов, а если cache = 0, то NAS вынужден работать с самой актуальной версией обьектов. Проблем я здесь не вижу. NAS работает в продуктивной ДБ, вы импортировали в неё изменённые / новые обьекты, НАС и должен с ними работать.
Никак не могу понять. Вы говорите - при старте NAS, если cache=0, то NAS работает с актуальной версией объектов. Т.е. объекты цепляются в этот момент, дальше NAS запускает кодюнит с таймером. При срабатывании события "Timer" NAS будет обновлять версию объектов? Или нет? Когда он это будет делать? Я поменял объект в момент времени N. При следующем срабатывании события "Timer" NAS уже будет работать с новой версией объекта?
Объясните пожалуйста
Old 21.04.2011, 13:37   #12  
RedFox is offline
RedFox
Участник
 
1,441 / 10 (0) +
Join Date: 28.12.2004
Location: Киев
Quote:
Originally Posted by Fly View Post
Объясню почему. Если в объекты вносятся какие-то правки, то NAS необходимо перезапускать, чтобы он работал с новой версией объекта. Если никуда не записывать последнюю дату и время сеанса интеграции, то после перезапуска сеанс повторится. А это не всегда хорошо (например, если выполняются тяжелые задания, типа коррекции себестоимости).
А вот сейчас неАсилил зачем связываться с объектами? Неужели они часто меняются? Кстати, не забываем про рекомендации от "производителя" - желательно перезапускать NAS периодически.

И проверено на практике, что SELECTLATESTVERSION не помогает в NAS.
Old 21.04.2011, 14:22   #13  
Fly is offline
Fly
Участник
Fly's Avatar
 
102 / 10 (1) +
Join Date: 05.10.2007
Quote:
Originally Posted by RedFox View Post
Quote:
Originally Posted by Fly View Post
Объясню почему. Если в объекты вносятся какие-то правки, то NAS необходимо перезапускать, чтобы он работал с новой версией объекта. Если никуда не записывать последнюю дату и время сеанса интеграции, то после перезапуска сеанс повторится. А это не всегда хорошо (например, если выполняются тяжелые задания, типа коррекции себестоимости).
А вот сейчас неАсилил зачем связываться с объектами? Неужели они часто меняются? Кстати, не забываем про рекомендации от "производителя" - желательно перезапускать NAS периодически.

И проверено на практике, что SELECTLATESTVERSION не помогает в NAS.
Потому что до окончания внедрения интеграции ею уже начинают пользоваться. Реализовал интеграцию по документам продажи, запустили. Потом находятся ошибки или пожелания по обмену еще какими-то атрибутами. Приходится вносить правки и перезапускать.
Old 21.04.2011, 17:58   #14  
alexb_imported is offline
alexb_imported
Участник
 
256 / 12 (1) ++
Join Date: 25.08.2006
Quote:
Originally Posted by Fly View Post
Никак не могу понять. Вы говорите - при старте NAS, если cache=0, то NAS работает с актуальной версией объектов. Т.е. объекты цепляются в этот момент, дальше NAS запускает кодюнит с таймером. При срабатывании события "Timer" NAS будет обновлять версию объектов? Или нет? Когда он это будет делать? Я поменял объект в момент времени N. При следующем срабатывании события "Timer" NAS уже будет работать с новой версией объекта?
Объясните пожалуйста
NAS такой же client как и обычный, только невидимый. При нулевом cache NAS (если он постоянно без промежуточных перезапусков работате) заметит то что обьект изменился только в момент обращения к обьекту, если cashe > 0 то будет работать всю дорогу с версией обьектов из cache до тех пор пока служба NAS не будет перезапущена (по идее, в этом и смысл object cache).

Quote:
Originally Posted by RedFox View Post
И проверено на практике, что SELECTLATESTVERSION не помогает в NAS.
У меня тоже проверено на практике: прекрасно работает
Old 21.04.2011, 23:45   #15  
Fly is offline
Fly
Участник
Fly's Avatar
 
102 / 10 (1) +
Join Date: 05.10.2007
Quote:
Originally Posted by AlexB View Post
NAS такой же client как и обычный, только невидимый. При нулевом cache NAS (если он постоянно без промежуточных перезапусков работате) заметит то что обьект изменился только в момент обращения к обьекту, если cashe > 0 то будет работать всю дорогу с версией обьектов из cache до тех пор пока служба NAS не будет перезапущена (по идее, в этом и смысл object cache).
Понятно. Тогда поставлю вопрос так. Раз клиент обычный, то NAS при каждом обращении к объекту, даже не знаю как сказать, ищет новую версию объекта в базе? Каждый раз?
Меня вот это интересует. Потому как Ваш способ очень хорошей и я даже плюсую, но вот этот тонкий момент очень важен.
Old 22.04.2011, 12:31   #16  
alexb_imported is offline
alexb_imported
Участник
 
256 / 12 (1) ++
Join Date: 25.08.2006
Quote:
Originally Posted by Fly View Post
Раз клиент обычный, то NAS при каждом обращении к объекту, даже не знаю как сказать, ищет новую версию объекта в базе? Каждый раз?
Меня вот это интересует. Потому как Ваш способ очень хорошей и я даже плюсую, но вот этот тонкий момент очень важен.
Именно так, каждый раз в момент обращения к обьекту. Но RedFox тоже прав, NAS рекомендуется периодически перезапускать, т.к на нулевой chache нельзя полагаться 100%, но именно периодически, а не каждые 10 минут, это уже перебор.
Old 22.04.2011, 13:39   #17  
Fly is offline
Fly
Участник
Fly's Avatar
 
102 / 10 (1) +
Join Date: 05.10.2007
Quote:
Originally Posted by AlexB View Post
Quote:
Originally Posted by Fly View Post
Раз клиент обычный, то NAS при каждом обращении к объекту, даже не знаю как сказать, ищет новую версию объекта в базе? Каждый раз?
Меня вот это интересует. Потому как Ваш способ очень хорошей и я даже плюсую, но вот этот тонкий момент очень важен.
Именно так, каждый раз в момент обращения к обьекту. Но RedFox тоже прав, NAS рекомендуется периодически перезапускать, т.к на нулевой chache нельзя полагаться 100%, но именно периодически, а не каждые 10 минут, это уже перебор.
Как вариант решения, можно и с нулевым cache. Но как по мне, то частое обращение к объектам (фактически при каждом срабатывании события Timer) не есть гуд.
 


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Рейтинг@Mail.ru
All times are GMT +3. The time now is 17:47.
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Contacts E-mail, Advertising.