Подтвердить что ты не робот

Как работает обновление пакета OSGi?

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

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


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

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

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

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

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

Из сообщения:

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

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

4b9b3361

Ответ 1

Связки имеют 2 вида зависимостей:

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

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

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

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

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

Ответ 2

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

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

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

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

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

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

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

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

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

Ответ 3

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

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

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