bl.beard писал(а):
2 Valery Solovey: все это так.
но это же общие слова.
а мне интересно описание конкретной технологии/процесса обновления ПО в разрезе BB.
может кто-то поделиться более конкретными(проверенными временем) идеями?
Ну, я не нашёл заказчиков, которым безразлично, на чём я буду делать ПО, поэтому моё предложение назвать проверенным сложно.
По поводу более конкретного примера.
Для ББ модуль - это то, что имеется в ОЗУ. Сам файл на диске никак не мониторится. Поэтому, если Вы только замените файл, то это не приведёт ни к каким последствиям. Если надо заменить файлы, то можно вызвать команду DevDebug.UnloadThis <ModuleList>. Указанные модули будут выгружены, и при очередном обращении к ним ББ подгрузит новые версии из новых файлов.
Это простейший вариант, имеющий один существенный недостаток: если компонент работает безостановочно круглые сутки, то выгрузка без предварительной подготовки приведёт к потере недообработанных данных. Как этого можно избежать:
1. перед выгрузкой компонента запретить ему приём на обработку новых данных (они будут складываться в пулл до момента возобновления работы). Дождаться окончания работы компонента, выгрузить его, возобновить обработку данных.
2. ввести транзакционность. Удалять входные данные только после того, как по ним получен результат. Если модуль выгрузили, и какие-то данные не были до конца обработаны, то они будут поданы на вход вновь загруженному модулю.
Более сложный вариант - использование директории. Вы записываете в директорию объект, через который ваше ПО работает с компонентом. Если нужно загрузить новую версию компонента, то записываете в директорию объект нового компонента. Поскольку ПО работает с компонентом через директорию, то после записи в директорию нового объекта связь со старым компонентом потеряется, и после завершения обработки данных его можно будет остановить (с помощью UnloadThis, опять же). Недостаток этого метода - в имени модуля. Чтобы новый модуль был загружен, нужно чтобы в системе ещё не было модуля с аналогичным именем. Решается изменением имени модуля.