Как работает обновление пакета OSGi? - PullRequest
23 голосов
/ 02 декабря 2010

Когда пакет обновляется (скажем, для исправления ошибки), что происходит с другими пакетами, которые в данный момент используют обновляемый?

Скажите, что есть два пакета service и dao. Скажем, что классы в комплекте услуг используют классы в пакете dao, когда я запускаю команду для обновления слоя dao. Получит ли исключение класс класса обслуживания, использующий код dao?


Спасибо за ваш ответ .

Я хотел сказать, обновлен с той же версией.

до тех пор, пока не произойдет обновление пакета, включающего зависимый пакет.

Операция обновления пакета запускается пользователем, обновляющим пакет, верно? Скажем, когда пользователь вызывает обновление для обновления dao-пакета, класс в службе bundle вызывал метод для класса в дао-слое ... что происходит в этом сценарии?

Я нашел этот пост полезным: http://solutionsfit.com/blog/2008/08/27/osgi-what-modularity-can-do-for-you-part-1/

Из должности:

Если мы просто заменим пакет на пакет, который включает исправление, контейнер отменит регистрацию старого пакета и зарегистрирует новый пакет. Затем прокси-сервер может обработать перетасовку ссылок и возобновить вызов службы. Это взаимодействие будет почти мгновенным. Ваши клиенты будут совершенно не замечать того, что произошло, и вы просто сэкономили своей компании значительную сумму денег (я слышу бонус?).

В этом сообщении в блоге вызов authorizePayment () был приостановлен до тех пор, пока не станет доступен обновленный пакет. Что происходит, если элемент управления находится в методе authorizePayment (), когда происходит обновление пакета?

Ответы [ 3 ]

20 голосов
/ 02 декабря 2010

Пакеты имеют 2 вида зависимостей:

  • Службы и
  • Соединения между загрузчиками классов, которые определяются именами пакетов.Эти соединения называются проводами.

Сервисы легко удалить, потому что это присуще их дизайну.Провода сложнее, потому что они запутаны в ваших объектах, и эти объекты не осознают динамику.Поэтому, когда вы устанавливаете новый пакет, старые пакеты остаются без изменений, ваши объекты не обновляются, и обновленный пакет все еще предоставляет свои провода в виде зомби.

Когда вы вызываете refreshPackages, платформа просматривает эти зависимости и находит пакеты, которые ссылаются на этих зомби.Каждый зомби тогда остановлен.Контракт на комплект состоит в том, что он должен быть убран.Мы помогаем пакету, выполняя за вас большую очистку, но некоторые вещи очень плохие, например, сохранение ссылок в статике других пакетов или забывание останавливать запущенные потоки.Другие пакеты, которые по-другому зависят от этих пакетов, получают уведомление об остановке пакета, поэтому они также могут очистить любые ссылки.После остановки пакетов пакеты не разрешаются, а затем снова разрешаются для новых пакетов.

Для реальных пакетов OSGi очистка является естественной и невидимой в вашем коде (как и должно быть).Он хорошо поддерживается такими инструментами, как декларативные сервисы, iPOJO, менеджер зависимостей, Spring, Blueprint и т. Д. Магия заключается в фокусировке на модели µservices, а не на хакерских загрузках классов dong.

Почему мы не обновляем автоматически?Ну, мы когда-то сделали, но обновление подрывает.Во многих случаях вам необходимо обновить несколько пакетов.Такое нарушение после каждого обновления было бы ненужным, болезненным.То есть после установки или обновления вы должны ВСЕГДА делать обновление, но вы можете ограничить количество установок / обновлений.

8 голосов
/ 23 февраля 2014

Когда вы обновляете пакет, используя команду OSGi ' update ', он, скорее всего, будет иметь другие зависимые пакеты, которые полагаются на него и уже захватывают набор загруженныхклассы из старой версии этого комплекта.Ситуация, которая обычно соответствует проблеме, описанной вами в вашем вопросе.

Чтобы избежать возможного несоответствия между различными версиями классов, включенных в этот пакет, контейнер OSGi решает временно скрыть новую версию обновленных классов пакета от внешнего мира.Вы можете думать об этом как о сохранении обновленных классов изолированно от других пакетов - на мгновение -.

Дело в том, что контейнер OSGi не может просто начать загрузку классов изновая версия целевого комплекта, поскольку зависимые комплекты в конечном итоге будут видеть старые версии уже загруженных классов, смешанные с новыми версиями тех же классов, которые были загружены после обновления, что может привести к несогласованности, которая приведет кнеконтролируемый беспорядок.То же самое касается удаления пакета, пакет удаляется из списка установленных пакетов, но не удаляется из памяти.Он должен храниться так, чтобы зависимые комплекты могли продолжать загружать из него классы.

Таким образом, вы можете думать о команде «update», как о введении новой версии того же комплекта, что она будет поставляется в зависимые пакеты, которые еще не поступили, - которые еще не были на момент обновления -.Хотя старая версия, существовавшая до обновления, остается в памяти , чтобы обеспечить обратную совместимость и избежать возможных сбоев в работе существующих пакетов, которые уже начали зависеть от обновленного пакета.

Обратите внимание, что старые версии хранятся только в памяти, а это означает, что перезапуск сервера приведет к удалению всех этих старых версий и приведению последней версии к таблице.Это имеет смысл, потому что не будет необходимости в обратной совместимости, просто потому, что все пакеты теперь запускаются в одно и то же время.

Что происходит дальше, это то, что вы должны явно вызвать ' refresh 'команда для определенных пакетов, - те, которые зависят от обновленного пакета - или вместо этого вы можете выбрать команду «обновить» без указания конкретного пакета, что означает, чтовсе связки будут обновляться вслепую.Команда «refresh» вызывает перестройку дерева зависимостей целевых комплектов и заставляет их загрузчики классов начинать загрузку необходимых классов с нуля.

Только тогда зависимые комплекты начнут видеть измененияВы внесли в код обновленных классов классы, которые были обновлены.

Правило состоит в том, что

Существующие разрешенные пакеты уже импортируют более старую версиюкласс не будет автоматически переадресован на новый пакет, если он не обновлен.

5 голосов
/ 02 декабря 2010

Когда пакет обновляется, устанавливается новая версия (биты пакета).Если другой пакет связан с предыдущей версией обновленного пакета, то есть другой пакет импортировал некоторый пакет, экспортированный предыдущей версией, или другой пакет, который требовал пакета в предыдущей редакции, то среда OSGi сохранит предыдущую версию обновленного пакета.пакет для обслуживания запросов на загрузку будущего класса из зависимого пакета, пока не произойдет обновление пакета, которое включает в себя зависимый пакет.

Цель этого состоит в том, чтобы минимизировать или задержать возмущающие зависимые пакеты при обновлении зависимости.Агент управления может захотеть обновить несколько пакетов и, в конце, сделать обновление пакета, чтобы «модернизировать» зависимости.Как только обновление пакета выполнено, к предыдущей версии обновленного пакета нет проводов, и платформа OSGi теперь может отказаться от предыдущей версии.

Так что в вашем примере, как правило, исключений не будет.Но, конечно, это зависит от того, что на самом деле делает рассматриваемый код и как пишутся их манифесты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...