Функция удаления OSGi работает, но пакеты все еще установлены - PullRequest
3 голосов
/ 27 декабря 2010

РЕДАКТИРОВАТЬ: обновил этот вопрос с последней информацией ...

У меня проблемы с запуском параллельных команд "functions: uninstall" для зависимых функций. OSGi отвечает «Состояние в процессе изменения ...», но, принимая другие запросы, мы сталкиваемся с проблемами.

Как ни странно, это приводит к успешному удалению функции, но неудачному удалению пакета. Мы решаем эту проблему, пытаясь правильно упорядочить запросы на удаление и добавляя задержку между шагами, но я надеюсь на более надежное решение.

Как и предполагалось, я также попытался добавить "osgi: refresh" между шагами ... такое же поведение. Есть ли другой способ обнаружить, что «пакеты обновления» все еще работают, чтобы задержать последующие запросы и т. Д.

Вот подробности ...

karaf @ root> функции: удалить PolicyUtil
karaf @ root> функции: удалить Policy1
Возможности karaf @ root>: удалить Policy2
Выполняется изменение состояния для пакета "file: /policy2.jar" по теме "Обновить пакеты".
Возможности karaf @ root>: удалить Policy3
Выполняется изменение состояния для пакета "file: /policy3.jar" по теме "Обновить пакеты".
Возможности karaf @ root>: удалить Policy4
karaf @ root> функции: удалить Enabler1
Выполняется изменение состояния для пакета "file: /enabler1.jar" по теме "Обновить пакеты".
karaf @ root> функции: удалить Enabler2
Выполняется изменение состояния для пакета "file: /enabler2.jar" по теме "Обновить пакеты".

потом ... в итоге мы удалили функции (правильно), но некоторые пакеты все еще установлены (неправильно)

OSGi: список

[277] [Установлено] [] [] [60] Политика2
[278] [Установлено] [] [] [60] Политика3
[280] [Установлено] [] [] [60] Enabler1
[281] [Установлено] [] [] [60] Enabler2

Особенности: список

[удалено] [1.0] PolicyUtil repo-0
[удалено] [1.0] Policy1 repo-0
[удалено] [1.0] Policy2 repo-0
[удалено] [1.0] Policy3 repo-0
[удалено] [1.0] Enabler1 repo-0
[удалено] [1.0] Enabler2 repo-0

Ответы [ 5 ]

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

Я не уверен, какое исключение вы получите, но вы должны знать одну вещь: когда вы удаляете пакет с помощью команды оболочки, такой как osgi:uninstall, вы фактически вызываете Bundle.uninstall()* 1004. *. Как вы можете прочитать в Javadoc, это еще не все.

Фреймворк предпочитает операции, которые оказывают минимальное влияние на остальную часть фреймворка, поэтому он может удалить пакет без удаления всех связанных пакетов. Если вы действительно хотите удалить их все, вы должны использовать команду osgi:refresh. Для получения дополнительной информации см. FAQ Феликса .

Лучший совет, который я могу дать, - не выдавать несколько uninstall запросов, которые могут пересекаться друг с другом. Если вы хотите удалить набор пакетов, я бы запустил непересекающиеся запросы uninstall(), а затем один refreshPackages(). Кроме того, я бы не совмещал управление пакетами, используя «обычную» консоль и Karaf в одной системе.

Вы также можете рассмотреть возможность использования внешнего менеджера для установки и удаления пакетов. Если вам нужно удаленное управление, вы можете выбрать Apache ACE (раскрытие: я приверженец Apache ACE).

2 голосов
/ 11 февраля 2013

Или ... вы можете просто удалить приложение с помощью этой команды:

karaf 2.2.x:

osgi: удалить --force yourapp-feature / 0.0.1.SNAPSHOT

1 голос
/ 07 января 2011

Хорошо, я копался в этом, и я думаю, что я понимаю проблему и варианты ... спасибо за ответы.

Когда выполняется «features: uninstall [name]», он вызывает bundle.uninstall (), а затем refreshPackages () для каждого пакета в функциях. Затем, после удаления всех пакетов, он вызывает refreshPackages () для всех пакетов. Проблема в том, что refreshPackages () является асинхронным (согласно спецификации OSGi ) и оставляет пакеты в разрешающем состоянии. Последующие запросы на удаление разрешающих функций / пакетов не выполняются должным образом.

Если между деинсталляциями имеется достаточная задержка или если выполняется более поздняя деинсталляция (после завершения refreshPackages ()) ... все работает как положено.

Параметры ...

  1. заказ зависимых функций / комплектов при удалении (сложно контролировать)
  2. установить задержку между командами удаления (не точно)
  3. убедиться, что ожидаемые функции / пакеты удалены (или продолжить ожидание)
  4. прослушивать события FrameworkEvent.PACKAGES_REFRESHED (сложные и не гарантированные, поскольку события имеют размер контейнера, см. этот пример )
  5. изменить Karaf / Felix для поддержки опции для синхронного обновления пакетов (см. эту проблему / разрешение для Karaf 2.1.3)
0 голосов
/ 12 ноября 2014

В моем случае я удалил функцию и заметил номера пакетов, а затем выключил karaf (3.x). Затем я удалил подпапки папки [karaf-install] / data / cache / [висит-номер-пакета]. Теперь я перезапускаю Караф и войны комплектов, не показанные в списке комплектов:

0 голосов
/ 28 декабря 2010

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

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

...